1.3 URI
URI是Uniform Resource Identifier的简写,是一个用于标识某一互联网资源名称的字符串。URI允许用户对互联网中的资源通过特定的协议进行交互操作,它包括语法和相关协议的定义。下面是几个RFC 3986上举的例子,通过这些例子,你可以具体体会一下URI的格式:
ftp://ftp.is.co.za/rfc/rfc1808.txt http://www.ietf.org/rfc/rfc2396.txt ldap://[2001:db8::7]/c=GB?objectClass?one mailto:John.Doe@example.com news:comp.infosystems.www.servers.unix tel:+1-816-555-1212 telnet://192.0.2.16:80/ urn:oasis:names:specification:docbook:dtd:xml:4.1.2
HTTP中的URI能够表达为绝对形式或者相对于一些已知的URI的形式,这两种形式是不同的,绝对URI始终由方案名接着冒号开始。关于URI语法和语义的定义信息,可以参考RFC 2396,在这里不做详细介绍。
HTTP协议没有对URI的长度做出任何强制规定。服务器必须能够处理它们服务的任何资源的URI,且应该能够处理长度极大的URI。如果URI超过服务器处理的长度,服务器应该返回414(Request-URI too long)状态。
1.3.1 URL
统一资源定位符(URL,Uniform / Universal Resource Locator的缩写)也被称为网页地址,如同在网络上的门牌,是因特网上标准的资源的地址(Address)。它最初是由蒂姆·伯纳斯·李发明,用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC 1738。URL用来通过HTTP协议定位网络资源。URL的具体格式如下:
协议://主机名[:端口号]/路径/[?查询]
下面是一个典型的URL:
http://www.example.com/usermgr/userinfo.do?userid=1
http 是协议,www.example.com是主机名,端口是80,/usermgr/userinfo.do是路径,userid=1是查询。
应该尽量避免在URL中使用IP地址(可以参考RFC 1900)。在作为访问资源的请求URI时,如果URL中不存在绝对路径,则它必须作为"/"。如果代理收到的主机名不是完整的描述的域名,则它可以增加它的域名到收到的主机名中。如果代理收到的是完整资源域名,则代理禁止修改主机名。
1.3.2 URI/URL/URN
可能通过以上简单的介绍,你会对URI/URL/URN的区别仍然不是很清楚。RFC 3986中关于三者的一段介绍如下:
A URI can be further classified as a locator, a name, or both. Theterm "Uniform Resource Locator" (URL) refers to the subset of URIs that, in addition to identifying a resource, provide a means oflocating the resource by describing its primary access mechanism(e.g., its network "location"). The term "Uniform Resource Name"(URN) has been used historically to refer to both URIs under the "urn" scheme [RFC2141], which are required to remain globally unique and persistent even when the resource ceases to exist or becomes unavailable, and to any other URI with the properties of a name.
An individual scheme does not have to be classified as being just one of "name" or"locator". Instances of URIs from any given scheme may have the characteristics of names or locators or both, often depending on the persistence and care in the assignment of identifiers by the naming authority, rather than on any quality of the scheme. Future specifications and related documentation should use the general term "URI" rather than the more restrictive terms "URL" and "URN" [RFC3305].
通过这段介绍我们可以得知:URI可被视为定位符(URL)、名称(URN)或两者兼备。统一资源名(URN)如同一个人的名称,而统一资源定位符(URL)代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。
维基百科也对URI和URL以及URN做出了解释:URI是标识一个互联网资源,并指定对其进行操作或取得该资源的方法的URL,可能通过对主要访问手段的描述,也可能通过网络“位置”进行标识。例如,http://www.wikipedia.org/这个URL,标识一个特定资源(首页)并表示该资源的某种形式(例如,以编码字符表示的,首页的HTML代码)是可以通过HTTP协议从www.wikipedia.org这个网络主机获得的。URN是基于某命名空间通过名称指定资源的URI。人们可以通过URN来指出某个资源,而无须指出其位置和获得方式。资源无须是基于互联网的。例如,URN urn:isbn:0-395-36341-1 指定标识系统(即国际标准书号ISBN)和某资源在该系统中的唯一表示的URI。它可以允许人们在不指出其位置和获得方式的情况下谈论这本书。
可见,URL和URN都是URI的子集。不过,在平时的工作和生活中用的最多的是URL,也就是把URI和URL看做是一个事物。如果你还有兴趣进一步仔细区分三者的话,可以参考RFC 3305,这个标准里描述了三者的具体关系。
1.3.3 URI比较
当通过比较两个URI来判断它们是否匹配时,客户端应该对整个URI使用大小写敏感的字节对字节进行比较,除了以下例外:
· 空或者没有给出的端口号与该URI使用的默认端口号相同。
· 比较主机名必须是大小写不敏感的。
· 比较方案名必须是大小写不敏感的。
· 空绝对路径与绝对路径“/”相同。
不在“保留”和“不安全”字符集中的字符与其URL编码相同。例如,下面三个URI是相同的:
http://example.com:80/~smith/home.html
http://example.com/%7Esmith/home.html
http://example.com:80/%7esmith/home.html