HTTPにおけるURLの比較

HTTPにおけるURLの比較

[10] HTTP では URL比較正規化の方法が規定されています。 基本的にはオクテット列としての比較になりますが、 大文字小文字の同一視など、多少の正規化が行われます。

[11] HTTP 仕様上どこで比較が行われるのかは明確には記述されていませんが、 キャッシュされている資源URL との照合に当たって同一性の判断に使うのでしょう。

仕様書

RFC 7230 による定義

[88] http:https:URL は、 RFC 3986//6 の方法により正規化比較できます >>87

[89] 既定のポート番号と等しいポート番号なら、 省略したものが正規形 (normal form) です >>87

[90] 絶対形OPTIONS 要求要求対象として使われる場合を除き、 path が空であるものと / は等価で、 / が正規形です。 >>87

[95] OPTIONS に限るという条件は以前の仕様にはありませんでした。 文脈により、2種類の比較正規化があり得ることとなります。

[91] host大文字・小文字不区別で、小文字正規形です。 >>87

[94] パーセント符号化されている部分は大文字正規形であるものと (RFC 3986 との整合性から) 推察されますが、明記はされていません。

[92] reserved 以外の文字パーセント符号化されているのと等価で、 パーセント符号化しないのが正規形です。 >>87

[93] URI で使えない文字はパーセント符号化したものを正規形とするのが (RFC 3986 との整合性から) 適当と思われますが、明記はされていません。

変種

[85] HSTS における実効要求URL比較では、 >>16path が無い場合と / の場合は別とします >>84

[86] HSTS (RFC 6797) は RFC 2616 を参照しています。

文脈

[1] 隣接異体の定義ではこの比較方法が参照されています。

[3] 単純参照の制約ではこの比較方法が使われています。

単純参照を参照。

関連

[12] URLパターンも参照。

歴史

RFC 1945

[22] RFC 1945 では比較の方法は規定されていませんでしたが、かわりに http: URL正準形 (canonical form) が定義されていました。

[82] 後の >>4 よりは少し条件が少なくなっています。

RFC 2068、RFC 2616

[18] RFC 2068正準形のかわりに比較の規定が追加され、 RFC 2616 で改訂されています >>8。両者でその内容は変わっていません。

[83] この比較の適用対象の URL は明記されていません。 http: に限らず、 https: など関係する URL scheme 一般に適用可能なものとみられます。

[4] 比較は次のように行います >>8

[21] この定義は、RFC 3986 で「URI参照は○○するべきである」 という正規形の規定が存在するもの (RFC 3986//6) とほぼ一致しています。

[19] RFC 2616 に対する正誤票で、元々 >>17 は「reserved または unsafe」となっていたところが、 unsafe が削られています。

unsafeURL に使えない文字なので、百分率符号化されていてもいなくても常に意味は同じになります。 (URI に使えない文字が入っているものは URI ではないとの立場では、 unsafe が含まれることはあり得ないのでどちらでも同じです。)

[20] 次の3例は等しいです。 >>8

この3つはいずれも同等。

メモ

[2] RFC 2616 の規定によると http://foo.example:80/http://foo.example:00080/ は等しくありませんね。

実際のブラウザとかの実装は等しいとみなすみたいですけど。 (でもそうじゃない実装ももしかしたらあるかもしれない。)

[6] RFC 3510 - Internet Printing Protocol/1.1: IPP URL Scheme ( 版) <https://tools.ietf.org/html/rfc3510#section-4.7>

When comparing two IPP URLs to decide if they match or not, an IPP

Client MUST use the same rules as those defined for HTTP URI

comparisons in [RFC2616], with the sole following exception:

- A port that is empty or not given MUST be treated as equivalent to

the well-known port for that IPP URL (port 631);

[9] RFC 7472 - Internet Printing Protocol (IPP) over HTTPS Transport Binding and the 'ipps' URI Scheme ( 版) <https://tools.ietf.org/html/rfc7472#section-4.6>

Per PWG "IPP Everywhere" [PWG5100.14], when comparing two 'ipps' URIs

to decide whether or not they match, an IPP Client MUST use the same

rules as those defined for 'http' and 'https' URI comparisons in

[RFC7230], with the following single exception:

- A port that is empty or not given MUST be treated as equivalent to

the well-known port for that 'ipps' URI (port 631).