2月阅读周·HTTP权威指南:URL与资源之各种令人头疼的字符篇

举报
叶一一 发表于 2025/02/23 15:29:02 2025/02/23
【摘要】 引言HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解...

引言

HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。

《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。

这本书主要包括以下内容:

  • 第一部分描述了Web的基础构件与HTTP的核心技术
  • 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
  • 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
  • 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
  • 第五部分介绍了发布和传播Web内容的技巧。
  • 第六部分是一些很有用的参考附录,以及相关技术的教程。

URL与资源

URL就是因特网资源的标准化名称。URL指向一条电子信息片段,告诉你它们位于何处,以及如何与之进行交互。

各种令人头疼的字符

URL是可移植的(portable)。它要统一地命名因特网上所有的资源,这也就意味着要通过各种不同的协议来传送这些资源。这些协议在传输数据时都会使用不同的机制,所以,设计URL,使其可以通过任意因特网协议安全地传输是很重要的。

安全传输意味着URL的传输不能丢失信息。有些协议,比如传输电子邮件的简单邮件传输协议(Simple Mail Transfer Protocol, SMTP),所使用的传输方法就会剥去一些特定的字符。[插图]为了避开这些问题,URL只能使用一些相对较小的、通用的安全字母表中的字符。

除了希望URL可以被所有因特网协议进行传送之外,设计者们还希望URL也可供人类阅读。因此,即使不可见、不可打印的字符能够穿过邮件程序,从而成为可移植的,也不能在URL中使用。

URL还得是完整的,这就使问题变得更加复杂了。URL的设计者们认识到有时人们可能会希望URL中包含除通用的安全字母表之外的二进制数据或字符。因此,需要有一种转义机制,能够将不安全的字符编码为安全字符,再进行传输。

URL字符集

默认的计算机系统字符集通常都倾向于以英语为中心。从历史上来看,很多计算机应用程序使用的都是US-ASCII字符集。US-ASCII使用7位二进制码来表示英文打字机提供的大多数按键和少数用于文本格式和硬件通知的不可打印控制字符。

由于US-ASCII的历史悠久,所以其可移植性很好。

而且,有些URL中还会包含任意的二进制数据。认识到对完整性的需求之后,URL的设计者就将转义序列集成了进去。通过转义序列,就可以用US-ASCII字符集的有限子集对任意字符值或数据进行编码了,这样就实现了可移植性和完整性。

编码机制

为了避开安全字符集表示法带来的限制,人们设计了一种编码机制,用来在URL中表示各种不安全的字符。这种编码机制就是通过一种“转义”表示法来表示不安全字符的,这种转义表示法包含一个百分号(%),后面跟着两个表示字符ASCII码的十六进制数。

字符限制

在URL中,有几个字符被保留起来,有着特殊的含义。有些字符不在定义的US-ASCII可打印字符集中。还有些字符会与某些因特网网关和协议产生混淆,因此不赞成使用。

表1-1列出了一些字符,在将其用于保留用途之外的场合时,要在URL中对其进行编码。

4-1.jpg

另外一点说明

你可能会感到奇怪,为什么使用一些不安全字符的时候并没有发生什么不好的事情。比如,你可以访问http://www.joes-hardware.com/~joe上的Joe主页,而无需对“~”字符进行编码。对某些传输协议来说,这并不是什么问题,但对应用程序开发人员来说,对非安全字符进行编码仍然是明智的。

应用程序要按照一定规范工作。客户端应用程序在向其他应用程序发送任意URL之前,最好把所有不安全或受限字符都进行转换[插图]。只要对所有不安全字符都进行了编码,这个URL就是可在各应用程序之间共享的规范形式;也就无需操心其他应用程序会被字符的任何特殊含义所迷惑了。

最适合判断是否需要对字符进行编码的程序就是从用户处获取URL的源端应用程序。URL的每个组件都会有自己的安全/不安全字符,哪些字符是安全/不安全的与方案有关,因此只有从用户那里接收URL的应用程序才能够判断需要对哪些字符进行编码。

当然,另一种极端的做法就是应用程序对所有字符都进行编码。尽管并不建议这么做,但也没有什么强硬且严格的规则规定不能对那些安全字符进行编码;但在实际应用中,有些应用程序可能会假定不对安全字符进行编码,这么做的话可能会产生一些奇怪的破坏性行为。

有时,有些人会恶意地对额外的字符进行编码,以绕过那些对URL进行模式匹配的应用程序——比如,Web过滤程序。对安全的URL组件进行编码会使模式匹配程序无法识别出它们所要搜寻的模式。总之,解释URL的应用程序必须在处理URL之前对其进行解码。

有些URL组件要便于识别,并且必须由字母开头,比如URL的方案

总结

有些URL中还会包含任意的二进制数据。认识到对完整性的需求之后,URL的设计者就将转义序列集成了进去。通过转义序列,就可以用US-ASCII字符集的有限子集对任意字符值或数据进行编码了,这样就实现了可移植性和完整性。


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。