如果我在网站
example.com/foo/index.html
上,并且有一个带有 href a
的 ./bar/test.html
标签,我希望链接文档的 URL 为 example.com/foo/bar/test.html
。然而,在 Chrome 或 Firefox 等网络浏览器中,这种行为似乎有所不同,它解析为 example.com/bar/test.html
。
我想,
./
表示当前目录,在本例中是example.com/foo/
现实生活中的例子:在https://www.salzburger-landestheater.at/de/spielplan/index.html上,有一个标签:
<a href="./produktionen/shakespeare-im-park-golden-lads-amp-girls.html?ID_Vorstellung=5527&m=3">Shakespeare im Park: Golden Lads & Girls</a>
如果点击该链接,Chrome 会将我发送至 https://www.salzburger-landestheater.at/de/produktionen/shakespeare-im-park-golden-lads-amp-girls.html?ID_Vorstellung=5527&m=3,这是正确的位置。 但是,我希望链接为https://www.salzburger-landestheater.at/de/spielplan/produktionen/shakespeare-im-park-golden-lads-amp-girls.html?ID_Vorstellung=5527&m=3
例如,当使用 Ruby 时,它会输出我期望的 URL(遗憾的是,这会导致 404 页面):
URI.join("https://www.salzburger-landestheater.at/de/spielplan/index.html", "./produktionen/shakespeare-im-park-golden-lads-amp-girls.html?ID_Vorstellung=5527&m=3").to_s
=> "https://www.salzburger-landestheater.at/de/spielplan/produktionen/shakespeare-im-park-golden-lads-amp-girls.html?ID_Vorstellung=5527&m=3"
我猜 Chrome 做得正确,但我真的不明白;
/spielplan/
不是由 ./
引用的当前目录吗?有人可以指点我官方文档吗?
我找到了 RFC 3986,第 5.4.1 节,其中给出了以下示例:
在具有明确定义的基本 URI 的表示中
http://a/b/c/d;p?q
相对引用将转换为其目标 URI,如下所示。
[...]
“./g”=“http://a/b/c/g”
作为参考,RFC 示例按预期在 Ruby 中运行:
> URI.join("http://a/b/c/d;p?q", "./g").to_s
=> "http://a/b/c/g"
实际上我刚刚在我的“现实生活”例子中意识到了这个问题。我将问题保留在网上,以防有人偶然发现类似的问题。
文档
https://www.salzburger-landestheater.at/de/spielplan/index.html
定义了一个base
:<base href="https://www.salzburger-landestheater.at/de/">
因此,
./produktionen/shakespeare-im-park-golden-lads-amp-girls.html?ID_Vorstellung=5527&m=3
正确解析为base_url + href
:https://www.salzburger-landestheater.at/de/produktionen/shakespeare-im-park-golden-lads-amp-girls.html?ID_Vorstellung=5527&m=3