相对URI以及base的设置

标准:
RFC3986 - Uniform Resource Identifier (URI): Generic Syntax

html里面有个元素类型叫base,这本来是个简单的概念,但是看了下html标准(https://www.w3.org/TR/WD-html40-970917/htmlweb.html) 中举的一个base设置的例子,我倒有点困惑了,这个例子是这样的:

As an example of relative URL resolution, assume we have the base URL "http://www.acme.com/support/intro.html". The relative URL in the following markup for a hypertext link:
<A href="suppliers.html">Suppliers</A> would expand to the full URL "http://www.acme.com/support/suppliers.html"

这里的base是一个html页面的地址,我之前总以为base应该是个目录的地址。于是去看了下URI的标准,算是明晰了相对URI和base的概念。

相对引用(Relative Reference)和相对路径引用(relative-path reference)

rfd3986 的 4.2. Relative Reference。
并不是说一个URI看起来像文件系统中的相对路径就是相对引用,实际上,按照标准中规定的格式看,没有最前面的scheme(就是http:, ftp: 之类的)的uri都是相对引用,也就是说www.example.com/abc.html也是个相对引用。
相对引用又分为 绝对路径引用相对路径引用,这个划分就和我们分辨文件系统中的相对/绝对路径差不多了: 以 '/' 开头的就是绝对路径引用,否则就是相对路径引用。

base和相对引用的解析

一个相对引用(不管是绝对路径引用还是相对路径引用)都不是一个完整的uri,这就需要解析成完整的uri才能使用,而base就是这个解析这个相对引用的基准。
显然,一个相对引用需要和base以某种方式合并起来,才能构成一个完整的uri,标准文档的5.2. Relative Resolution 给出了解析的过程,这个过程是一个先分解后合并的过程,合并的步骤中包括path的合并这一步,从path合并的说明中,就可以明白为什么base可以设置成一个具体页面的地址。
rfc3986 5.2.3. Merge Paths。
首先,只有当相对引用的path部分是一个相对路径时,其path才需要和base的path进行合并,如果是绝对路径,直接使用绝对路径引用的path。
merge中明确说明: 把相对引用的路径部分添加到base uri的路径 除去最后一段的部分。并且还特别说明除去最后一段就是指除去最右边的'/'后面的任何字符。

结论

base uri中的path部分确实是起到类似指定一个目录的作用,只不过如果你设定的base如果不是以 '/' 结尾,那么使用时就会认为最后一段不是目录而把最后一段去掉,如果是以 '/' 结尾,就认为是一个目录,可以直接使用。

posted on 2017-06-22 18:06  等待未知  阅读(308)  评论(0编辑  收藏  举报

导航