href="./etc" 的 a 标签是如何解析的? Chrome 不遵守 RFC 3986?

问题描述 投票:0回答:1

如果我在网站

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&amp;m=3">Shakespeare im Park: Golden Lads &amp; 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"
html ruby url rfc3986
1个回答
0
投票

实际上我刚刚在我的“现实生活”例子中意识到了这个问题。我将问题保留在网上,以防有人偶然发现类似的问题。

文档

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&amp;m=3
正确解析为
base_url + href
https://www.salzburger-landestheater.at/de/produktionen/shakespeare-im-park-golden-lads-amp-girls.html?ID_Vorstellung=5527&amp;m=3

© www.soinside.com 2019 - 2024. All rights reserved.