@guoxs
2015-09-26T19:50:11.000000Z
字数 4973
阅读 4625
HTTP
大多数URL方案的URL语法都建立在这个由9部分构成的通用格式上:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
通用URL组件:
组件 | 描述 | 默认值 |
---|---|---|
方案 | 访问服务器以获取资源时要使用哪种协议 | 无 |
用户 | 某些方案访问资源时需要的用户名 | 匿名 |
密码 | 用户名后面可能要包含的密码,中间由冒号(:)分隔 | E-mail 地址 |
主机 | 资源宿主服务器的主机名或点分IP 地址 | 无 |
端口 | 资源宿主服务器正在监听的端口号。很多方案都有默认端口号(HTTP 的默认端口号为80) | 每个方案特有 |
路径 | 服务器上资源的本地名,由一个斜杠(/)将其与前面的URL 组件分隔开来。路径组件的语法是与服务器和方案有关的(本章稍后会讲到URL路径可以分为若干个段,每段都可以有其特有的组件。) | 无 |
参数 | 某些方案会用这个组件来指定输入参数。参数为名/值对。URL中可以包含多个参数字段,它们相互之间以及与路径的其余部分之间用分号(;)分隔 | 无 |
查询 | 某些方案会用这个组件传递参数以激活应用程序(比如数据库、公告板、搜索引擎以及其他因特网网关)。查询组件的内容没有通用格式。用字符“?”将其与URL 的其余部分分隔开来 | 无 |
片段 | 一小片或一部分资源的名字。引用对象时,不会将frag字段传送给服务器;这个字段是在客户端内部使用的。通过字符“#”将其与URL的其余部分分隔开来 | 无 |
。URL 最重要的3 个部分是方案(scheme)、主机(host)和路径(path)。
方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL 的其余部分分隔开来。方案名是大小写无关的。
主机组件标识了因特网上能够访问资源的宿主机器。可以用上述主机名(www.joeshardware.com),或者IP 地址来表示主机名。
端口组件标识了服务器正在监听的网络端口。对下层使用了TCP 协议的HTTP 来说,默认端口号为80。
例如:
ftp://ftp.prep.ai.mit.edu/pub/gnu
:无用户或密码组件,只有标准的方案、主机和路径。
ftp://anonymous@ftp.prep.ai.mit.edu/pub/gnu
:
没有指定用户名和密码,它就会插入anonymous(匿名用户)作为你的用户名,并发送一个默认的密码(Internet Explorer 会发送IEUser,Netscape Navigator 则会发送mozilla)。字符“@”将用户和密码组件与URL 的其余部分分隔开来。
ftp://anonymous:my_passwd@ftp.prep.ai.mit.edu/pub/gnu
:,指定了用户名(anonymous)和密码(my_passwd),两者之间由
字符“:”分隔。
URL 的路径组件说明了资源位于服务器的什么地方。路径通常很像一个分级的文件系统路径。
可以用字符 /
将HTTPURL的路径组件划分成一些路径段(path segment)(与UNIX文件系统中的文件路径类似)。每个路径段都有自己的参数(param)组件。
负责解析URL的应用程序需要协议的参数来访问资源。否则,另一端的服务器可能就不会为请求提供服务或者提供错误的服务。
ftp://prep.ai.mit.edu/pub/gnu;type=d
例子中,有一个参数type=d,参数名为type,值为d。
http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue&size=large
?
号后是查询语句,很多网关都希望查询字符串以一系列“名/ 值”对的形式出现,名值对之间用字符“&”分隔。
URL 支持使用片段(frag)组件来表示一个资源内部的片段。比如,URL可以指向HTML文档中一个特定的图片或小节。
片段挂在URL 的右手边,最前面有一个字符 #
:
http://www.joes-hardware.com/tools.html#drills
HTTP 服务器通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器。浏览器从服务器获得了整个资源之后,会根据片段来显示你感兴趣的那部分资源。
一个在前端重构比较有用的运用就是页面内锚点。
URL 有两种方式:绝对的和相对的。目前只有相对的URL,绝对URL中包含有访问资源所需的全部信息。
相对URL是不完整的,要从相对URL中获取访问资源所需的全部信息,就必须相对于另一个,被称为其基础(base)的URL进行解析。
在前端中的./
和../
等。
基础URL
可以来自以下几个地方:
- 在资源中显式提供
- 封装资源的基础 URL
- 没有基础 URL
解析相对引用
这个算法将一个相对URL转换成了其绝对模式,之后就可以用它来引用资源了。这个算法最初是在RFC 1808 中制定的,后来被合并到了RFC 2396 中。
在主机名扩展中,只要有些小提示,浏览器通常就可以在没有帮助的情况下,将你输入的主机名扩展为完整的主机名。
主机名扩展技巧可能会为其他一些HTTP应用程序带来问题,比如代理。
将以前用户访问过的URL历史存储起来。当用户再次输入URL 时,就可以将输入的URL与历史记录中URL的前缀进行匹配,并提供一些完整的选项以供选择。
为了避开安全字符集表示法带来的限制,人们设计了一种编码机制,用来在URL中表示各种不安全的字符。这种编码机制就是通过一种“转义”表示法来表示不安全字符的,这种转义表示法包含一个百分号(%),后面跟着两个表示字符ASCII 码的十六进制数。
字符 | ASCII码 | 示例URL |
---|---|---|
~ | 126(0x7E) | http://www.joes-hardware.com/%7Ejoe |
空格 | 32(0x20) | http://www.joes-hardware.com/more%20tools.html |
% | 37(0x25) | http://www.joes-hardware.com/100%25satisfaction.html |
在URL 中,有几个字符被保留起来,有着特殊的含义。有些字符不在定义的USASCII可打印字符集中。还有些字符会与某些因特网网关和协议产生混淆,因此不
赞成使用。
字 符 | 保留/受限 |
---|---|
% | 保留作为编码字符的转义标志 |
/ | 保留作为路径组件中分隔路径段的定界符 |
. | 保留在路径组件中使用 |
.. | 保留在路径组件中使用 |
# | 保留作为分段定界符使用 |
? | 保留作为查询字符串定界符使用 |
; | 保留作为参数定界符使用 |
: | 保留作为方案、用户/ 口令,以及主机/ 端口组件的定界符使用 |
$, + | 保留 |
@ & = | 在某些方案的上下文中有特殊的含义,保留 |
{ } | \ ^ ~ [ ] ' |
< > " | 不安全;这些字符在URL范围之外通常是有意义的,比如在文档中对URL自身进行定界(比如http://www.joes-hardware.com),所以应该对其进行编码0x00-0x1F,0x7F受限,这些十六进制范围内的字符都在US-ASCII 字符集的不可打印区间内>0x7F受限,十六进制值在此范围内的字符都不在US-ASCII 字符集的7 比特范围内 |
HTTP
: 超文本传输协议方案,除了没有用户名和密码之外,与通用的URL格式相符。如果省略了端口,就默认为80。
基本格式:
http://<host>:<port>/<path>?<query>#<frag>
HTTPS
: 方案https与方案http是一对。唯一的区别在于方案https 使用了网景的SSL,SSL为HTTP连接提供了端到端的加密机制。其语法与HTTP的语法相同,默认端口为443。
基本格式:
https://<host>:<port>/<path>?<query>#<frag>
mailto
: Mailto URL指向的是E-mail地址。由于E-mail的行为与其他方案都有所不同(它并不指向任何可以直接访问的对象),所以mailto URL的格式与标准URL的格式也有所不同。因特网E-mail 地址的语法记录在RFC 822 中。
基本格式:
mailto:<RFC-822-addr-spec>
ftp
: 文件传输协议URL可以用来从FTP服务器上下载或向其上载文件,并获取FTP服务器上的目录结构内容的列表。在Web 和URL 出现之前FTP就已经存在了。Web 应用程序将FTP作为一种数据访问方案使用。URL语法遵循下列通用格式。
基本格式:
ftp://<user>:<password>@<host>:<port>/<path>;<params>
rtsp,rtspu
: RTSP URL是可以通过实时流传输协议(Real Time Streaming Protocol)解析的音/视频媒体资源的标识符。方案rtspu中的u
表示它是使用UDP协议来获取资源的。
基本格式:
rtsp://<user>:<password>@<host>:<port>/<path>
rtspu://<user>:<password>@<host>:<port>/<path>
UDP 是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
file
: 方案file表示一台指定主机(通过本地磁盘、网络文件系统或其他一些文件共享系统)上可直接访问的文件。各字段都遵循通用格式。如果省略了主机名,就默认为正在使用URL 的本地主机。
基本格式:
file://<host>/<path>
news
: 方案news用来访问一些特定的文章或新闻组。它有一个很独特的性质:news URL自身包含的信息不足以对资源进行定位。
news URL 中缺乏到何处获取资源的信息——没有提供主机名或机器名称。从用户那里获取此类信息是解释程序的工作。比如,在网景浏览器的“选项”(Options)菜单中,就可以指定自己的NNTP(news)服务器。这样,浏览器有了news URL的时候就知道应该使用哪个服务器了。新闻资源可以从多台服务器中获得。它们被称为位置无关的,因为对它们的访问不依赖于任何一个源服务器。
news URL 中保留了字符“@”,用来区分指向新闻组的news URL 和指向特定新闻文章的news URL。
基本格式:
news:<newsgroup>
news:<news-article-id>
telnet
: 方案telnet用于访问交互式业务。它表示的并不是对象自身,而是可通过telnet协议访问的交互式应用程序(资源)。
基本格式:
telnet://<user>:<password>@<host>:<port>/
URL无法根据资源名定位资源,如果资源被移走,则无法找到资源。为了应对这种问题,因特网工程任务组(Internet Engineering Task Force,IETF)已经对一种名为统一资源名(uniform resource name,URN)的新标准做了一段时间的研究了。无论对象搬移到什么地方(在一个Web服务器内或是在不同的Web服务器间),URN都能为对象提供一个稳定的名称。
永久统一资源定位符(PURL):persistent uniform resource locators,其基本思想是在搜索资源的过程中引入另一个中间层,通过一个中间资源定位符(resource locator)服务器对资源的实际URL进行登记和跟踪。客户端可以向定位符请求一个永久URL,定位符可以以一个资源作为响应,将客户端重定向到资源当前实际的URL上去。
更多有关PURL的知识可参考:http://purl.oclc.org。