[3] [[HTTP]] における[DFN[[RUBYB[[[実効要求URL]]]@en[effective request URL]]]]は、
[[HTTP]] [[要求メッセージ]]から復元した[[要求]]されている [[URL]] です。

* 仕様書

[REFS[
- [15] '''[CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-5.5>'''
- [2] [CITE@en[RFC 6797 - HTTP Strict Transport Security (HSTS)]] ([TIME[2014-06-02 05:16:10 +09:00]] 版) <http://tools.ietf.org/html/rfc6797#section-9>
- [1] [CITE@en[RFC 6797 - HTTP Strict Transport Security (HSTS)]] ([TIME[2014-06-02 05:16:10 +09:00]] 版) <http://tools.ietf.org/html/rfc6797#page-12>
]REFS]

* 定義

[17] [[利用者エージェント]]においては、[[対象URL]]が[[実効要求URL]]です [SRC[>>15]]。

[4] [[鯖]]では、[RUBYB[実効要求URL]@en[effective request URL]]は次のように決定します。
[FIG(steps)[
= [5] [[要求対象]]が [CODE(ABNF)@en[[[absolute-form]]]] なら、
それが[[実効要求URL]]です [SRC[>>15, >>2]]。
= [6] [[要求対象]]がそれ以外なら、次のような [[URL]] が[[実効要求URL]]です [SRC[>>15, >>2]]。
-= [18] [[URL scheme]] は、
-== [19] [[鯖]]の設定や[[外向き]]の[[関門]]により決まるなら、その値。 [SRC[>>15]]
-== [7] それ以外で、 [[TLS]]/[[TCP]] [SRC[>>15, >>2]] や
[[SSL]]/[[TCP]] [SRC[>>2]] なら [CODE(URI)@en[[[https:]]]]。
-== [20] それ以外で ([[TCP]] なら [SRC[>>2]]) [CODE(URI)@en[[[http:]]]] [SRC[>>15, >>2]]。
-= [22] [[authority]] は、
-== [23] [[鯖]]の設定や[[外向き]]の[[関門]]により決まるなら、その値。 [SRC[>>15]]
-== [8] それ以外で、 [CODE(HTTP)@en[[[Host:]]]] が空でないなら、その値。 [SRC[>>15, >>2]]
-== [24] それ以外なら、[[鯖]]の設定による既定の名前と、[[接続]]の[[ポート番号]]が
[[URL scheme]] の[[既定のポート番号]]と異なるなら、その値。 [SRC[>>15]]
-= [25] [[path]] と [[query]] は、
-== [9] [[要求対象]]が [CODE(ABNF)@en[[[authority-form]]]] か
[CODE(ABNF)@en[[[asterisk-form]]]] なら、空。 [SRC[>>15, >>2]]
-== [26] それ以外なら、[[要求対象]]。 [SRC[>>15, >>2]]
]FIG]

;; [21] [[HSTS]] と [[RFC 7230]] では、実質的な定義は同じですが、
定義方法が微妙に異なっています。特に [[RFC 7230]] は、[[鯖]]の設定を用いることが認められています。
この違いが意図的なのか、それとも出版時期の違いによるものなのかはわかりません。

;; [10] [[HSTS]] では、 [CODE(HTTP)@en[[[Host:]]]] がない場合は未定義 [SRC[>>2]]
とされていました。

;; [11] [[HSTS]] では、 [CODE(ABNF)@en[[[authority-form]]]] の場合、
[[実効要求URL]]は未定義 [SRC[>>2]] とされていました。この形を使うのは
[CODE(HTTP)@en[[[CONNECT]]]] の時なので、 [[HSTS]] では[[実効要求URL]]
を定義する必要がありませんでした。

[13] [[HTTP/1.1]] 仕様に従わない[[要求]]については定義も言及もされていません。
例えば[[非ASCII文字]]が含まれる場合は定義されていません。

;; [27] [[RFC 7230]] によればそのような場合 [CODE(HTTP)[[[400]]]]
を返すことになっていますから、問題ではないと考えているのかもしれません。
しかし現実にはそのような[[要求]]を送信する[[クライアント]]がありますから、
適当に[[パーセント符号化]]されていたと解釈するべきかもしれません。

[34] [[素片識別子]]が含まれている場合の扱いも不明です。

;; [35] 同じく、[[素片識別子]]を送信する[[クライアント]]がありますから、
適宜無視するべきだと思われます。

[28] [[HTTP]] over [[Unixドメインソケット]]のように、
適当な [[URL scheme]] が存在せず[[実効要求URL]]が決められないこともあります。

* 比較

[14] [[比較]]は、 [[RFC 2616]] の定義によるとされています [SRC[>>2]]
([[HTTPにおけるURLの比較]]を参照)。ただし [[path]] が無い [[URL]]
と [CODE[[[/]]]] は異なるものとして扱わなければ[['''なりません''']] [SRC[>>2]]。

;; [36] [CODE[absolute-form]] も参照。

* ホスト

[29] [[クライアント]]は[[要求対象]]や [CODE(HTTP)@en[[[Host:]]]] に任意の値を指定できますから、
[[鯖]]はこれが適切な値かどうか検査する必要があります。

;; [[要求対象]]、[CODE(HTTP)@en[[[Host:]]]] も参照。

[32] [[TLS]] を用いている場合、 [[SNI]] に指定された値と[[実効要求URL]]
の値が一致しているか確認する必要があります。

;; [[SNI]] も参照。

[30] この検査を怠ると、 [[DNS rebinding]] 攻撃その他の[[脆弱性]]につながることがありますし、
[[鯖]]や[[アプリケーション]]の設計や実装方法次第で[[認証]]をすり抜けるなどの不具合が生じる場合もあり、危険です。

[31] [[セキュリティー]]上の問題以外でも、同一の[[資源]]を表す [[URL]]
が複数になり参照する人や場面によって異なる [[URL]] になって不便が生じることもあります。

* 関連

[33] [[ダイジェスト認証]]では、 [[credentials]] の [CODE(HTTP)@en[[[uri=""]]]]
[[引数]]にも指定することになっています。

[16] [[CGI]] では[[実効要求URL]]と実質的に同じものが[[スクリプトURL]]と呼ばれています。

[12] [[実効要求URL]]の[[scheme]]と[[authority]]のことを、
[[正準根URL]]といいます。