2月阅读周·HTTP权威指南:URL与资源之URL的语法篇

举报
叶一一 发表于 2025/02/23 15:27:32 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的语法

URL提供了一种定位因特网上任意资源的手段,但这些资源是可以通过各种不同的方案(比如HTTP、FTP、SMTP)来访问的,因此URL语法会随方案的不同而有所不同。

这是不是意味着每种不同的URL方案都会有完全不同的语法呢?实际上,不是的。大部分URL都遵循通用的URL语法,而且不同URL方案的风格和语法都有不少重叠。大多数URL方案的URL语法都建立在这个由9部分构成的通用格式上:

<scheme>://<user>:<password>@<host>:<port>/<path>; <params>? <query>#<frag>

几乎没有哪个URL中包含了所有这些组件。URL最重要的3个部分是方案(scheme)、主机(host)和路径(path)。表1-1对各种组件进行了总结。

表1-1 通用URL组件

3-1.jpg

比如,我们来看看URL:http://www.joes-hardware.com:80/index.html,其方案是http,主机为www.joes-hardware.com,端口是80,路径为/index.html。

方案——使用什么协议方案

实际上是规定如何访问指定资源的主要标识符,它会告诉负责解析URL的应用程序应该使用什么协议。在我们这个简单的HTTP URL中所使用的方案就是http。

方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL的其余部分分隔开来。方案名是大小写无关的,因此URL“http://www.joes-hardware.com”和“HTTP://www.joes-hardware.com”是等价的。

主机与端口

要想在因特网上找到资源,应用程序要知道是哪台机器装载了资源,以及在那台机器的什么地方可以找到能对目标资源进行访问的服务器。URL的主机和端口组件提供了这两组信息。

主机组件标识了因特网上能够访问资源的宿主机器。可以用上述主机名(www.joes-hardware.com),或者IP地址来表示主机名。比如,下面两个URL就指向同一个资源——第一个URL是通过主机名,第二个是通过IP地址指向服务器的:

http://www.joes-hardware.com:80/index.html
http://161.58.228.45:80/index.html

端口组件标识了服务器正在监听的网络端口。对下层使用了TCP协议的HTTP来说,默认端口号为80。

用户名和密码

更有趣的组件是用户和密码组件。很多服务器都要求输入用户名和密码才会允许用户访问数据。FTP服务器就是这样一个常见的实例。这里有几个例子:

ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous@ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous:my passwd@ftp.prep.ai.mit.edu/pub/gnu
http://joe:joespasswd@www.joes-hardware.com/sales info.txt

第一个例子没有用户或密码组件,只有标准的方案、主机和路径。如果某应用程序使用的URL方案要求输入用户名和密码,比如FTP,但用户没有提供,它通常会插入一个默认的用户名和密码。比如,如果向浏览器提供一个FTP URL,但没有指定用户名和密码,它就会插入anonymous(匿名用户)作为你的用户名,并发送一个默认的密码(Internet Explorer会发送IEUser, Netscape Navigator则会发送mozilla)。

第二个例子显示了一个指定为anonymous的用户名。这个用户名与主机组件组合在一起,看起来就像E-mail地址一样。字符“@”将用户和密码组件与URL的其余部分分隔开来。

在第三个例子中,指定了用户名(anonymous)和密码(my passwd),两者之间由字符“:”分隔。

路径

URL的路径组件说明了资源位于服务器的什么地方。路径通常很像一个分级的文件系统路径。比如:

http://www.joes-hardware.com:80/seasonal/index-fall.html

这个URL中的路径为/seasonal/index-fall.html,很像UNIX文件系统中的文件系统路径。路径是服务器定位资源时所需的信息。可以用字符“/”将HTTP URL的路径组件划分成一些路径段(path segment)(还是与UNIX文件系统中的文件路径类似)。每个路径段都有自己的参数(param)组件。

参数

对很多方案来说,只有简单的主机名和到达对象的路径是不够的。除了服务器正在监听的端口,以及是否能够通过用户名和密码访问资源外,很多协议都还需要更多的信息才能工作。

负责解析URL的应用程序需要这些协议参数来访问资源。否则,另一端的服务器可能就不会为请求提供服务,或者更糟糕的是,提供错误的服务。比如,像FTP这样的协议,有两种传输模式,二进制和文本形式。你肯定不希望以文本形式来传送二进制图片,这样的话,二进制图片可能会变得一团糟。

为了向应用程序提供它们所需的输入参数,以便正确地与服务器进行交互,URL中有一个参数组件。这个组件就是URL中的名值对列表,由字符“; ”将其与URL的其余部分(以及各名值对)分隔开来。它们为应用程序提供了访问资源所需的所有附加信息。比如:

ftp://prep.ai.mit.edu/pub/gnu; type=d

在这个例子中,有一个参数type=d,参数名为type,值为d。

如前所述,HTTP URL的路径组件可以分成若干路径段。每段都可以有自己的参数。比如:

http://www.joes-hardware.com/hammers; sale=false/index.html; graphics=true

这个例子就有两个路径段,hammers和index.html。hammers路径段有参数sale,其值为false。index.html段有参数graphics,其值为true。

查询字符串

很多资源,比如数据库服务,都是可以通过提问题或进行查询来缩小所请求资源类型范围的。

假设Joe的五金商店在数据库中维护着一个未售货物的清单,并可以对清单进行查询,以判断产品是否有货,那就可以用下列URL来查询Web数据库网关,看看编号为12731的条目是否有货:

http://www.joes-hardware.com/inventory-check.cgi?item=12731

这个URL的大部分都与我们见过的其他URL类似。只有问号(?)右边的内容是新出现的。这部分被称为查询(query)组件。URL的查询组件和标识网关资源的URL路径组件一起被发送给网关资源。基本上可以将网关当作访问其他应用程序的访问点(第8章会对网关进行详细的讨论)。

有一个作为Joe的五金商店清单查询应用程序的网关的服务器,在这个例子中向此服务器发送了一个查询组件。查询的目的是检查清单中是否有尺寸为large、颜色为blue的条目12731。

片段

有些资源类型,比如HTML,除了资源级之外,还可以做进一步的划分。比如,对一个带有章节的大型文本文档来说,资源的URL会指向整个文本文档,但理想的情况是,能够指定资源中的那些章节。

为了引用部分资源或资源的一个片段,URL支持使用片段(frag)组件来表示一个资源内部的片段。

比如,URL可以指向HTML文档中一个特定的图片或小节。片段挂在URL的右手边,最前面有一个字符“#”。比如:

http://www.joes-hardware.com/tools.html#drills

在这个例子中,片段drills引用了Joe的五金商店Web服务器上页面/tools.html中的一个部分。这部分的名字叫做drills。

HTTP服务器通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获得了整个资源之后,会根据片段来显示你感兴趣的那部分资源。

总结

URL提供了一种定位因特网上任意资源的手段,但这些资源是可以通过各种不同的方案(比如HTTP、FTP、SMTP)来访问的,因此URL语法会随方案的不同而有所不同。


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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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