[10] [[HTTP]] では [[URL]] の[[比較]]の方法が規定されています。 基本的には[[オクテット列]]としての比較になりますが、 [[大文字]]と[[小文字]]の同一視など、多少の正規化が行われます。 [11] [[HTTP]] 仕様上どこで[[比較]]が行われるのかは明確には記述されていませんが、 [[キャッシュ]]されている[[資源]]の [[URL]] との照合に当たって同一性の判断に使うのでしょう。 [83] この比較の適用対象の [[URL]] は明記されていません。 [CODE(HTTP)@en[[[http:]]]] に限らず、 [CODE(HTTP)@en[[[https:]]]] など関係する [[URL scheme]] 一般に適用可能なものとみられます。 * 仕様書 - [7] [[RFC 2616]] (旧 [[RFC 2068]]) -- [8] [CSECTION@en[3.2.3 URI Comparison]] (旧 ) [6] >>8 の比較対照・日本語訳が [[HTTPにおけるURL]] の項にあります。 * 定義 [4] [SRC[>>8]] - [5] 基本的には[[オクテット]]毎に[[大文字・小文字を区別する]]形で比較する[['''べきです''']]。 - [15] [[scheme]] 名の[[大文字・小文字を区別]]しては[['''なりません''']]。 - [14] [[ホスト名]]の[[大文字・小文字を区別]]しては[['''なりません''']]。 - [13] [[ポート]]が[[空]]または省略されている時は、[[既定のポート]]と同じです。 - [16] [[path]] が[[空]]であることと [CODE(URI)[[[/]]]] だけであることは同じです。 - [17] [CODE(ABNF)@en[[[reserved]]]] に含まれる[[文字]]''以外''は[[百分率符号化]]されていてもいなくても同じです。 ;; [21] この定義は、[[RFC 3986]] で「[[URI参照]]は~するべきである」 という正規形の規定が存在するものとほぼ一致しています。 * 歴史 [18] この規定は [[RFC 2068]] で追加され、[[RFC 2616]] で改訂されていますが (>>8)、 その内容は変わっていません。 [19] [[RFC 2616]] に対する[[正誤票]]で、元々 >>17 は「[CODE(ABNF)@en[[[reserved]]]] または [CODE(ABNF)@en[[[unsafe]]]]」となっていたところが、 [CODE(ABNF)@en[[[unsafe]]]] が削られています。 ;; [CODE(ABNF)@en[[[unsafe]]]] は [[URL]] に使えない[[文字]]なので、[[百分率符号化]]されていてもいなくても常に意味は同じになります。 [WEAK[([[URI]] に使えない[[文字]]が入っているものは [[URI]] ではないとの立場では、 [CODE(ABNF)@en[[[unsafe]]]] が含まれることはあり得ないのでどちらでも同じです。)]] * 歴史 [22] [[RFC 1945]] では[[比較]]の方法は規定されていませんでしたが、かわりに [CODE(HTTP)@en[[[http:]]]] [[URL]] の[RUBYB[[[正準形]]]@en[canonical form]]が定義されていました。 ;; [23] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2011-02-03 22:19:39 +09:00]] 版) - [24] [[host]] は[[小文字]]に - [25] [[port]] が [[80]] なら手前の [CODE(URI)[[[:]]]] も含めて削除 - [81] [[path]] が空なら [CODE(URI)[[[/]]]] を補う [82] >>4 よりは少し条件が少なくなっています。 * 例 [20] 次の3例は等しいです。 [SRC[>>8]] - [CODE(URI)[http://abc.com:80/~smith/home.html]] - [CODE(URI)[http://ABC.com/%7Esmith/home.html]] - [CODE(URI)[http://ABC.com:/%7esmith/home.html]] この3つはいずれも同等。 * メモ [2] HTTP RFCs の規定によると [SAMP(URI)[http://foo.example:80/]] と [SAMP(URI)[http://foo.example:00080/]] は等しくありませんね。 実際のブラウザとかの実装は等しいとみなすみたいですけど。 (でもそうじゃない実装ももしかしたらあるかもしれない。)