Techioz Blog

href=“./etc” のタグはどのように解決されますか? Chrome は RFC 3986 に準拠していませんか?

概要

サイト example.com/foo/index.html にいて、 href ./bar/test.html のタグがある場合、リンクされたドキュメントの URL は example.com/foo/bar になると予想されます。 /テスト.html。ただし、Chrome や Firefox などの Web ブラウザでは、この動作は異なるようで、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 を見つけました。次の例が記載されています。

参考までに、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 はベースを定義しています:

したがって、 ./produktionen/shakespeare-im-park-golden-lads-amp-girls.html?ID_Vorstellung=5527&m=3 は、base_url + href: https://www.salzburger-landestheater.at/de/produktionen/ に正しく解決されます。シェイクスピア-イム-パーク-ゴールデン-ラッド-アンプ-ガールズ.html?ID_Vorstellung=5527&m=3