[8048] [DFN[[RUBYB[[[要求対象]]]@en[request target]]]]は、[[要求メッセージ]]の[[要求行]]に指定される、
[[要求]]の適用対象を表す文字列です。[[要求対象]]は、[[対象URL]]
の一部を表しています。

;; [8049] [[RFC 2616]] までは [CODE(ABNF)@en[[[Request-URI]]]] と呼ばれていました。

* 仕様書

[REFS[
- [8020] [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.3>
- [8016] [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-3.1.1>
- [8017] [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.1>
- [8044] [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.7.2>
- [14] [CITE[UPnP Device Architecture 2.0]] ([TIME[2014-09-05 02:24:48 +09:00]] 版) <http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf#page=23>
]REFS]

* 対象資源と対象URL

[8018] [[HTTP]] 通信を行う[[利用者エージェント]]の目的は、
[[要求]]の[RUBYB[意味]@en[semantics]]と、その意味が適用される[DFN[[RUBYB[対象資源]@en[target resource]]]]の組み合わせです
[SRC[>>8017]]。

[8019] [[対象資源]]は普通[DFN[[RUBYB[[[対象URI]]]@en[target URI]]]]によって識別されます。
[[対象URI]]は、[[素片識別子]]を含みません。 [SRC[>>8017]]

[8050] [[対象URL]]は直接[[要求メッセージ]]には現れず、[[要求対象]]として記述されます。
[[要求対象]]その他 [[HTTP]] [[要求メッセージ]]に現れる情報などから復元した[[要求]]の[[対象]]であったと考えられる
[[URL]] のことを、[[実効要求URL]]といいます。

;; [[利用者エージェント]]においては[[実効要求URL]]とは[[対象URL]]であると定義されています。

* 要求対象

[8022] [DFN[[RUBYB[[[要求対象]]]@en[request target]]]]は[[要求メッセージ]]の[[対象資源]]を表すもので、
[[要求行]]に含まれます。

[8021] [[要求対象]]は、[[要求行]]に記述します。

[8023] [[要求対象]]には次に示す4つの形式があります [SRC[>>8020]]。

[FIG(railroad)[
= |
== [CODE(ABNF)@en[origin-form]]
== [CODE(ABNF)@en[absolute-form]]
== [CODE(ABNF)@en[authority-form]]
== [CODE(ABNF)@en[asterisk-form]]
]FIG]

;; [16] [[RFC 2616]] 世代までは[DFN[[RUBYB[要求URL]@en[request URL]]]] 
([DFN[[CODE(ABNF)@en[[[request-URI]]]]]]) と呼ばれていましたが、 [[URL]]
でない [CODE(HTTP)[*]] も含まれるためか、 [[RFC 723x]] 世代で[[要求対象]]に改められています。

[FIG(table)[

:method: [[要求メソッド]]
:origin: [CODE(ABNF)@en[origin-form]]
:absolute: [CODE(ABNF)@en[absolute-form]]
:authority: [CODE(ABNF)@en[authority-form]]
:asterisk: [CODE(ABNF)@en[asterisk-form]]

:method: [CODE[CONNECT]]
:authority: [MUST[MUST]]
:absolute: ×
:asterisk: ×
:origin: ×

:method: [CODE[OPTIONS]] ([[サーバー]]全体)
:asterisk: [[起源サーバー]]への[[要求]]
:absolute: [[プロキシ]]への[[要求]]
:origin: ×
:authority: ×

:method: [CODE[OPTIONS]] (その他)
:origin: [[起源サーバー]]への[[要求]]
:absolute: [[プロキシ]]への[[要求]]
:authority: ×
:asterisk: ×

:method: その他
:origin: [[起源サーバー]]への[[要求]]
:absolute: [[プロキシ]]への[[要求]]
:authority: ×
:asterisk: ×

]FIG]

[21] [[HTTP/2]] では[[要求行]]がなく、かわりに[[疑似ヘッダー]]を使います。
[[HTTP/1.1]] [[以下]]の[[要求対象]]とおおむね対応する用法が規定されていますが、
[CODE(HTTP)@en[[[:scheme]]]] は [CODE(ABNF)@en[[[origin-form]]]] 相当と
[CODE(ABNF)@en[[[asterisk-form]]]] 相当で必須となっており、
[CODE(HTTP)@en[[[:authority]]]] は [CODE(ABNF)@en[[[asterisk-form]]]]
相当で必須となっている点は異なります。

[31] [[ダイジェスト認証]]では [CODE[[[response=""]]]] [[引数]]や
[CODE[[[rspauth=""]]]] [[引数]]の計算にも使います。

[32] [[ダイジェスト認証]]では [CODE[[[uri=""]]]] [[引数]]にも[[要求URL]]を指定します。

* [CODE(ABNF)@en[origin-form]]

[8028] [DFN[[CODE(ABNF)@en[[[origin-form]]]]]] は、
[[絶対パス]]か、
または[[絶対パス]]のあとに [CODE(URI)[[[?]]]] と [CODE(ABNF)@en[[[query]]]]
が続くものです
[SRC[>>8020 5.3.1.]]。

[FIG(railroad)[
= [[絶対パス]]
= ?
== [CODE(URI)[[[?]]]]
== [CODE(ABNF)@en[[[query]]]]
]FIG]

;; [8029] [[素片識別子]]は認められていません。

;; [8032] [[ホスト]]と[[ポート]]は [CODE(HTTP)@en[[[Host:]]]]
によって指定します。

[8030] [[クライアント]]は、 [CODE(HTTP)@en[[[CONNECT]]]] や[[鯖]]全体に対する
[CODE(HTTP)@en[[[OPTIONS]]]] の[[要求]]の場合を除き、
[[起源鯖]]に直接[[要求]]するときには、
[CODE(ABNF)@en[[[origin-form]]]] を[[要求対象]]として指定しなければ[['''なりません''']]
[SRC[>>8020 5.3.1.]]。

;; [8031] [[対象URL]]の[[パス]]が[[空]]の時は、
[CODE(URI)@en[[[/]]]] を送らなければ[['''なりません''']] [SRC[>>8020 5.3.1.]]。

[17] [[HTTP/2]] では、[[擬似ヘッダー]] [CODE(HTTP)@en[[[:path]]]] と
[CODE(HTTP)@en[[[:scheme]]]] を指定し [CODE(HTTP)@en[[[:authority]]]]
を指定しない ([CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]を指定する)
形に相当するようです。 [[HTTP/1.1]] [[以下]]の[[要求]]を[[プロキシ]]で
[[HTTP/2]] に変換して[[転送]]する場合に現れます。

* [CODE(ABNF)@en[absolute-form]]

[8033] [DFN[[CODE(ABNF)@en[[[absolute-form]]]]]] は、
[[RFC 3986]] [CODE(ABNF)@en[[[absolute-URI]]]] です
[SRC[>>8020 5.3.2.]]。

[FIG(railroad)[
= [[URL scheme]]
= [CODE[:]]
= ?
== [CODE[//]]
== [[authority]]
= [CODE(ABNF)@en[[[path]]]]
= ?
== [CODE(URI)[[[?]]]]
== [CODE(ABNF)@en[[[query]]]]
]FIG]

;; [8034] [F[素片][素片識別子]]は認められていません。

;; [33] 構文上 [[userinfo]] は禁止されていませんが、あまり適切では無さそうです。

[8035] [[クライアント]]は、 [CODE(HTTP)@en[[[CONNECT]]]] や[[鯖]]全体に対する
[CODE(HTTP)@en[[[OPTIONS]]]] の[[要求]]の場合を除き、
[[串]]に[[要求]]するときには、
[CODE(ABNF)@en[[[absolute-form]]]] を[[要求対象]]として指定しなければ[['''なりません''']]
[SRC[>>8020 5.3.2.]]。

[8036] [[HTTP/1.1]] [[クライアント]]は[[串]]に対する[[要求]]でしかこの形を使いませんが、
[[鯖]]はこの形の[[要求]]を受け入れなければ[['''なりません''']] 
[SRC[>>8020 5.3.2.]]。

;; [8037] 将来の[[HTTPの版]]ですべての[[要求]]を [CODE(ABNF)@en[[[absolute-form]]]]
に移行できるようにするため [SRC[>>8020 5.3.2.]] と説明されています。

;; [8038] [CODE(HTTP)@en[[[Host:]]]] と両方指定されたときはどう処理されるのでしょうか。
→ [CODE(HTTP)@en[[[Host:]]]] 参照。 [CODE(HTTP)@en[[[Host:]]]] が無視されます。
なお [CODE(HTTP)@en[[[Host:]]]] はそれでも必ず指定しなければなりません。

[8043] [[要求鎖]]の最後の[[串]]は、 [CODE(HTTP)@en[[[OPTIONS]]]] [[要求]]を
[CODE(ABNF)@en[[[absolute-form]]]] で受信した時は、
[[パス]]が空で [[query]] がなければ、
[[起源鯖]]に[[転送]]する際に[[要求対象]]を [CODE(URI)[[[*]]]]
に変更して送信しなければ[['''なりません''']] [SRC[>>8020 5.3.4.]]。

[8] 古い [[HTTP/1.0]] [[鯖]]は、[[絶対URL]]での[[要求]]に [CODE(HTTP)[[[404]]]] 
[[応答]]を返すことがあります。

[18] [[HTTP/2]] では[[疑似ヘッダー]]として [CODE(HTTP)@en[[[:scheme]]]]
、[CODE(HTTP)@en[[[:authority]]]]、[CODE(HTTP)@en[[[:path]]]]
を指定する形に相当します。ほとんどの [[HTTP/2]] [[要求]]はこの形を使います。

* [CODE(ABNF)@en[authority-form]]

[8039] [DFN[[CODE(ABNF)@en[[[authority-form]]]]]] は、 [[RFC 3986]]
[CODE(ABNF)@en[[[authority]]]] です [SRC[>>8020 5.3.3.]]。

[FIG(railroad)[
= [[ホスト]]
= ?
== [CODE(URI)[[[:]]]]
== [[ポート]]
]FIG]

[8040] [[クライアント]]は、 [CODE(HTTP)@en[[[CONNECT]]]] 
[[メソッド]]によって[[トンネル]]を確立するときは、
[[対象URL]]の [[authority]] ([[userinfo]] と [CODE[[[@]]]] 以外)
のみを送信しなければ[['''なりません''']] [SRC[>>8020 5.3.3.]]。

[19] [[HTTP/2]] では[[疑似ヘッダー]] [CODE(HTTP)@en[[[:authority]]]]
を指定し、 [CODE(HTTP)@en[[[:scheme]]]] と [CODE(HTTP)@en[[[:path]]]]
を指定しない形に相当します。 [CODE(HTTP)@en[[[CONNECT]]]]
[[要求]]でのみ使われます。

[34] [[ポート]]が省略された場合にどう解釈するべきかはあまり明確ではありません。
常に [N[80]] とみなすべきでしょうか。

;; [[実効要求URL]]も参照。

* [CODE(ABNF)@en[asterisk-form]]

[8041] [DFN[[CODE(ABNF)@en[asterisk-form]]]] は、[[文字]]
[DFN[[CODE(URI)[*]]]] です [SRC[>>8020 5.3.4.]]。

[FIG(railroad)[
= [CODE(HTTP)[*]]
]FIG]

[8042] [[クライアント]]は、[CODE(HTTP)@en[OPTIONS]]
[[要求]]を[[鯖]]全体に対して行いたいときは、
[CODE(URI)[*]] を送らなければ[MUST[なりません]] [SRC[>>8020 5.3.4.]]。

[15] [[SSDP]] の[[要求メソッド]] [CODE(HTTP)@en[[[NOTIFY]]]], [CODE(HTTP)@en[[[M-SEARCH]]]]
でも[[要求URL]]には [CODE(URI)[[[*]]]] を使います [SRC[>>14]]。

[20] [[HTTP/2]] では[[疑似ヘッダー]] [CODE(HTTP)@en[[[:scheme]]]] と
[CODE(HTTP)@en[[[:authority]]]] を指定し、 [CODE(HTTP)@en[[[:path]]]]
は [CODE(HTTP)[*]] と指定する形が相当します。

* 長さ

[503] 実際上[[要求行]]の長さには色々な制限が課されていますが、
最低でも8000[[オクテット]]の[[要求行]]には対応する[['''べき''']]である [SRC[>>8016]]
とされています。
([[要求行]]には[[要求対象]]の他に[[メソッド]]や[[HTTPの版]]も含まれています。)

[502] [[構文解析]]したい [[URI]] の長さを超える[[要求対象]]を受信した[[鯖]]は、
[CODE(HTTP)[[[414]]]] を返さなければ[['''なりません''']] [SRC[>>8016]]。
[SEE[ [[414]] ]]

[39] [[URLの長さ]]も参照。

* 構文解析とエラー処理

[8011] [[Request-URI]] に [[URL scheme]] や [[authority]] が含まれている場合で、それがその[[起源鯖]]が提供している[[資源]]の
[[URL scheme]] と [[authority]] でないとき、 [CODE(HTTP)[[[400]]]] [[応答]]を返すのが良さそうです。

;; [8012] [[RFC]] には [[authority]] が正しくない時に [CODE(HTTP)[[[400]]]] を返すと規定があります。
[[URL scheme]] については言及がありません。

[22] [[要求対象]]が [CODE[//]] から始まるとき、 [[Apache]] も [[nginx]] も、
[CODE(ABNF)@en[[[absolute-form]]]] と解釈するようです。 [TIME[2015-07-23T02:04:17.900Z]]

;; [[authority]] から始まる[[相対URL]]とは解釈しません。

@@ [23] [[非ASCII文字]]が含まれるとき、

[24] [[nginx]] は [CODE(ABNF)@en[absolute-form]] や [CODE(ABNF)@en[origin-form]]
でないとき、[[要求行]]を受け取った時点で [[HTTP/0.9]] [[応答]]
([CODE(HTTP)[[[400]]]] 相当の [[HTML文書]]) を返すようです。 [TIME[2015-09-13T12:41:00.200Z]]

* 書き換え

[8045] [[串]]は、[[要求対象]]の[[ホスト名]]が [[FQDN]] でないなら、
自身の[[ドメイン]]を追加してから[[転送]]して構いません [SRC[>>8044]]。
[[FQDN]] なら変更しては[['''なりません''']] [SRC[>>8044]]。

;; [8046] [[串]]は [CODE(HTTP)@en[[[Host:]]]] を[[転送]]時に再生成することになっていますので、
そちらも書き換わります。

[8047] [[串]]は、他の規定による場合を除き、[[転送]]時に[[要求対象]]の[[絶対パス]]や
[CODE(ABNF)@en[[[query]]]] を書き換えては[['''なりません''']] [SRC[>>8044]]。

;; [9] [[パーセント符号化]]の正規化なども認められていないようです。

[25] [[ダイジェスト認証]]では、[[要求対象]]が[[プロキシ]]に書き換えられる可能性があるとして、
[[credentials]] の [CODE(HTTP)@en[[[uri=""]]]] [[引数]]にも[[実効要求URL]]
を指定できるとしています。

* URL の起源

[26] [[対象URL]]は、普通はその[[サーバー]]の[[起源]]と[[同じ起源]]です。

[28] [[HTTP/2]] では、異なる[[起源]]であっても、[[IPアドレス]]と[[証明書]]が同じ[[HTTP接続]]を再利用できることになっています。

;; [[HTTP接続]]の再利用の項を参照。

[27] [[プロキシ]]の場合、いろいろな[[起源]]の[[要求]]を受信することになります。
[[FTP over HTTP]] や [[Gopher over HTTP]] のように、異なる [[URL scheme]]
が使われることもあります。

[29] [[サーバー]]が[[起源サーバー]]として動作するか[[プロキシ]]として動作するかは、
[[サーバー]]の設定によって決まります。[[クライアント]]がどちらのつもりで接続するかも、
[[クライアント]]の設定によって決まります。どちらであるかは、
[[プロトコル]]の動作には明確には反映されません。どんな[[サーバー]]も、
任意の[[要求URL]]を受け取る可能性があり、[[クライアント]]はそれを禁止されていません。

[EG[
[30] 意味があるかどうかは別として、 [CODE(URI)@en[[[mailto:]]]] や
[CODE(URI)@en[[[data:]]]] のような [[URL]] が[[要求URL]]となることもあります。
]EG]

[35] [[Opportunistic Security for HTTP/2]] の場合、
[[HTTPS]] 上の[[要求]]であるにも関わらず [CODE[:scheme]] が [CODE(URI)@en[http][http:]] となります。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[8024] RFC 1945 (HTTP/1.0); RFC 2068・2616 (HTTP/1.1) 5.1.2 Request-URI
]FIGCAPTION]

> The Request-URI is a Uniform Resource Identifier ([DEL[Section]] [INS[section]] 3.2) and
identifies the resource upon which to apply the request.

[DFN[[CODE(ABNF)[Request-URI]]]] は統一資源識別子で、
[[要求]]を適用する[[資源]]を識別します。

>
- [INS[{1945:}]] Request-URI    = absoluteURI | abs_path
- [INS[{2068:}]] Request-URI    = "*" | absoluteURI | abs_path
- [INS[{2616:}]] Request-URI    = "*" | absoluteURI | abs_path | authority
- [INS[{Errata:}]] Request-URI    = "*" | absoluteURI | abs_path [ "?" query ] | authority

> The [DEL[[DEL[two]] [INS[three]]]] [INS[four]] options for Request-URI are dependent on the nature of the request. [INS[The asterisk "*" means that the request does not apply to a particular resource, but to the server itself, and is only allowed when the method used does not necessarily apply to a resource. One example would be]]

[CODE(ABNF)[Request-URI]] の4つの選択肢は要求の性質に依存します。[INS[星印 [CODE(HTTP)[*]] は、要求が特定の資源に適用するのではなく、サーバー自体に適用することを意味し、方式が必ずしも資源に適用する必要が無いときにだけ認めます。一つの例は]]

[INS[

> [INS[{2068,2616}]]
- [SAMP(HTTP)[OPTIONS * HTTP/1.1]]
]INS]

> The absoluteURI form is [DEL[only allowed]] [INS[required]] when the request is being made to a proxy.
The proxy is [DEL[[DEL[[INS[{1945}]] requested]] [INS[[INS[{2068}]] required]]]] [INS[[INS[{2616}]] REQUIRED]] to forward the request [INS[or service it from a valid cache,]] and return the response. [DEL[If the request is GET or HEAD and a prior response is cached, the proxy may use the cached message if it passes any restrictions in the Expires header field.]]
Note that the proxy [DEL[may]] [INS[MAY]]
forward the request on to another proxy or directly to the server
specified by the absoluteURI. In order to avoid request loops, a
proxy [DEL[must]] [INS[MUST]] be able to recognize all of its server names, including
any aliases, local variations, and the numeric IP address. An example
Request-Line would be:

[CODE(ABNF)[[[absoluteURI]]]] (絶対 URI) 書式は、[[串]]に対して要求を行う時に[DEL[だけ認めます]][INS[は必須です]]。
串は要求を転送[INS[するかまたは[[妥当]]な[[キャッシュ]]から供出]]して応答を返す'''必要があります'''。[DEL[要求が [CODE(HTTP)[[[GET]]]] または [CODE(HTTP)[[[HEAD]]]] で、前の応答がキャッシュされているときは、 [CODE(HTTP)[[[Expires]]]] 頭欄の制限を満たしていれば、串はそのキャッシュしたメッセージを使っても構いません。]]
串は要求を他の串に転送しても'''構いません'''し [CODE(ABNF)[absoluteURI]]
で指定されたサーバーに直接転送しても'''構わない'''ことに注意してください。
要求の循環を避けるため、串は別名, 局所変名, 数値 IP 番地を含めたすべてのサーバー名を認識することができなければ'''なりません'''。
[CODE(ABNF)[[[Request-Line]]]] の例:

>
- [DEL[ GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.0 ]]
- [DEL[ GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1 ]]

[INS[

> To allow for transition to absoluteURIs in all requests in future
versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI
form in requests, even though HTTP/1.1 clients will only generate
them in requests to proxies.

将来の版の HTTP ですべての要求を [CODE(ABNF)[absoluteURI]]
に移行することができるように、すべての HTTP/1.1 [[サーバー]]は要求中の
[CODE(ABNF)[absoluteURI]] 形式を受け入れなければ'''なりません'''。
たとえ HTTP/1.1 [[クライアント]]が串に対する要求でのみそれを生成するとしてもです。

[INS[

> The authority form is only used by the CONNECT method (section 9.9).

[CODE(ABNF)[[[authority]]]] 書式は [CODE(HTTP)[[[CONNECT]]]]
方式でのみ使用します。
]INS]
]INS]

> The most common form of Request-URI is that used to identify a
resource on an origin server or gateway. In this case[DEL[, only]]
the absolute path of the URI [DEL[is]] [INS[MUST be]] transmitted (see [DEL[Section]] [INS[section]] 3.2.1, abs_path) [INS[as the Request-URI, and the network location of the URI ([DEL[net_loc]] [INS[authority]]) MUST be transmitted in a Host header field]].
For example, a client wishing to retrieve the resource
above directly from the origin server would create a TCP connection
to port 80 of the host "www.w3.org" and send the lines:

[CODE(ABNF)[Request-URI]] の最も広く行われている書式は、
[[起源サーバー]]または[[関門]]の[[資源]]を識別するのに使います。
この場合、 URI の[[絶対経路]][DEL[のみ]]を[INS[[CODE(ABNF)[Request-URI]] として]]転送し'''なければなりません'''[INS[で、 URI のネットワーク部分 ([CODE(ABNF)[authority]]) は [CODE(HTTP)[[[Host]]]] 頭欄で転送しなければ'''なりません''']]。

[DEL[

>
- 
[PRE[
GET /pub/WWW/TheProject.html HTTP/1.0
]PRE]
]DEL]

[INS[

>
- 
[PRE[
GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org
]PRE]
]INS]

> followed by the remainder of the [DEL[Full-]]Request.
Note that the absolute path cannot be empty; if none is present in the original URI, it [DEL[must]] [INS[MUST]]
be given as "/" (the server root).

に要求の残りが続きます。
絶対経路は空になり得ないことに注意してください。元の URI
になにもないときには [CODE(URI)[/]] (サーバー根)
を与えなければ'''なりません'''。

[DEL[

[INS[

> [INS[{2068}]] If a proxy receives a request without any path in the Request-URI and
the method specified is capable of supporting the asterisk form of
request, then the last proxy on the request chain MUST forward the
request with "*" as the final Request-URI. For example, the request

串が[[経路]]のない [CODE(ABNF)[Request-URI]] の要求を受信し、指定されていた[[メソッド]]が星印書式の要求に対応することのできるものであるなら、
要求鎖の最後の串は [CODE(HTTP)[*]] を最後の [CODE(ABNF)[Request-URI]]
として要求を転送しなければ'''なりません'''。
例えば、要求

>
- OPTIONS http://www.ics.uci.edu:8001 HTTP/1.1

> would be forwarded by the proxy as

はホスト [CODE[www.ics.uci.edu]] のポート [CODE[8001]]
に接続した後、串によって転送されて

>
- 
[PRE[
OPTIONS * HTTP/1.1
Host: www.ics.uci.edu:8001
]PRE]

> after connecting to port 8001 of host "www.ics.uci.edu".

となります。
]INS]
]DEL]

> [DEL[[INS[{1945,2068}]] The Request-URI is transmitted [DEL[as an encoded string, where some characters may be escaped using the "% HEX HEX" encoding defined by RFC 1738 [4] ]] [INS[in the format specified in section 3.2.1]].]] [INS[[INS[{2616}]] If the Request-URI is encoded using the "% HEX HEX" encoding [42], the]] [DEL[[INS[{1945,2068}]] The]] origin server [DEL[must]] [INS[[INS[{2068,2616}]] MUST]] decode the Request-URI in order
to properly interpret the request. [INS[[INS[{2068,2616}]] Servers SHOULD respond to invalid Request-URIs with an appropriate status code.]]

[CODE(ABNF)[Request-URI]] が [CODE[% [[HEX]] HEX]] 符号化を使って符号化されている場合には、
起源サーバーは要求を適切に解釈するために
[CODE(ABNF)[Request-URI]] を復号しなければなりません。
サーバーは不当な [CODE(ABNF)[Request-URI]] に対して適当な状態符号で応答する'''べきです'''。

[INS[

> [INS[{2068,2616}]] [DEL[In requests that they forward, proxies]] [INS[A transparent proxy]] MUST NOT rewrite the
"abs_path" part of [DEL[a]] [INS[the received]] Request-URI [INS[when forwarding it to the next inbound server,]] [DEL[in any way]] except as noted above to
replace a null abs_path with "*"[DEL[, no matter what the proxy does in its internal implementation]].

;[INS[次の[[上り]]サーバーに]]転送する要求中では、[INS[透過]]串は、上で触れた null [CODE(ABNF)[abs_path]] を
[CODE(URI)[*]] で置換する場合を除いて、 [DEL[(その内部実装で串が何をしていようと、)]] [INS[受信した]]
[CODE(ABNF)[Request-URI]]
中の [CODE(ABNF)[[[abs_path]]]] 部分を書き換えては'''なりません'''。
]INS]

> [INS[{2068,2616}]] Note: The "no rewrite" rule prevents the proxy from changing the
meaning of the request when the origin server is improperly using a
non-reserved [DEL[[INS[{1945,2068}]] URL]] [INS[URI]] character for a reserved purpose. Implementers
should be aware that some pre-HTTP/1.1 proxies have been known to
rewrite the Request-URI.

注意: 「書き換えしない」規則によって、起源サーバーが[[非予約]] URI
文字を不適切に[[予約]]目的に使っているときに串が要求の意味を変えてしまうことを防ぎます。
実装者は、 HTTP/1.1 以前の串で [CODE(ABNF)[Request-URI]] を書き換えるものがあると分かっていることに注意するべきです。

[INS[

注: 注記なき修正は 1945→2068 の変更点。
]INS]
]FIG]

[FIG(quote)[
[FIGCAPTION[
[8025] RFC 2068・2616 (HTTP/1.1) 5.2 The Resource Identified by a Request
]FIGCAPTION]

> [DEL[HTTP/1.1 origin servers SHOULD be aware that the]] [INS[The]] exact resource
identified by an Internet request is determined by examining both the
Request-URI and the Host header field.

インターネット要求で識別される正確な資源は [CODE(ABNF)[Request-URI]]
と [CODE(HTTP)[[[Host]]]] 頭欄の両方の検査で決定します。

> An origin server that does not allow resources to differ by the
requested host MAY ignore the Host header field value [INS[when determining the resource identified by an HTTP/1.1 request]]. (But see
section [DEL[19.5.1]] [INS[19.6.1.1]] for other requirements on Host support in HTTP/1.1.)

要求されたホストによって資源を変えることを認めない起源サーバーは、[INS[HTTP/1.1 要求により識別される資源を決定する時に]] 
[CODE(HTTP)[Host]] 頭欄値を無視しても'''構いません'''。
(しかし HTTP/1.1 での [CODE(HTTP)[Host]] 対応の他の要件について 19.6.1.1 節を参照。)

> An origin server that does differentiate resources based on the host
requested (sometimes referred to as virtual hosts or vanity
host[INS[ ]]names) MUST use the following rules for determining the requested
resource on an HTTP/1.1 request:

要求されたホストによって資源を区別する起源サーバー
(時たま[[仮想ホスト]]とか変化ホスト名とか言われます。)
は、 HTTP/1.1 要求の要求している資源を決定するのに次の規則を使わなければ'''なりません'''。

>
= 1. If Request-URI is an absoluteURI, the host is part of the
Request-URI. Any Host header field value in the request MUST be ignored.
= 2. If the Request-URI is not an absoluteURI, and the request
includes a Host header field, the host is determined by the Host
header field value.
= 3. If the host as determined by rule 1 or 2 is not a valid host on
the server, the response MUST be a 400 (Bad Request) error message.

= [CODE(ABNF)[Request-URI]] が [CODE(ABNF)[absoluteURI]] なら、
ホストは [CODE(ABNF)[absoluteURI]] の一部。
要求中の [CODE(HTTP)[Host]] 頭欄値は無視しなければ'''なりません'''。
= [CODE(ABNF)[Request-URI]] が [CODE(ABNF)[absoluteURI]]
でなく、要求が [CODE(HTTP)[Host]] 頭欄を含んでいれば、
ホストは [CODE(HTTP)[Host]] 頭欄値で決定します。
= 規則 1・2 で決定したホストがそのサーバーで妥当なホストでなければ、
応答は [CODE(HTTP)[[[400]]]] (悪い要求) 誤りメッセージでなければ'''なりません'''。

> Recipients of an HTTP/1.0 request that lacks a Host header field MAY
attempt to use heuristics (e.g., examination of the URI path for
something unique to a particular host) in order to determine what
exact resource is being requested.

[CODE(HTTP)[Host]] 頭欄を欠いた HTTP/1.0 要求の受信者は、
どの資源が要求されているのかを決定するために発見的方法 (例えば特定ホストに固有の URI 経路を検査するとか)
を使うことを試みても'''構いません'''。
]FIG]

[8026] 
- RFC1945.Request-URI    = absoluteURI | abs_path
- RFC2068.Request-URI    = "*" | absoluteURI | abs_path
- RFC2616.Request-URI    = "*" | absoluteURI | abs_path | authority
- RFC2616-Errata.Request-URI    = "*" | absoluteURI | abs_path [ "?" query ] | authority
- RTSP.Request-URI = "*" | absolute_URI ;; RFC 2326 6.1

- [4] 新しい規格が出るたびに選択肢が増えていきますね!

[5]
HTTP で[[素片識別子]]を送ってくる糞ロボットもたまにいます。
([[名無しさん]] [WEAK[2004-03-16 07:53:34 +00:00]])

[6]
>>5 ロボットだけじゃなくて [[WinIE 6.0]] だったりするから藁えん。
([[名無しさん]] [WEAK[2004-05-17 12:39:12 +00:00]])

[7]
>>5-6 素片識別子つきで送ってくる困った UA
は古今絶えたことのないのでございますが、
それに対応していない鯖は素片識別子をちゃんと捨てないので利用者からすればまったく困ったこととなってしまいます。
(本来鯖としては別にあえて対応する必要もないのですけど、[[人に優しく自分に厳しく]]の原則からして、対応しておいても悪くないでしょう。)

ちょっと古いですけど、実際に問題になった例:
[CITE[CyberDogの不具合]] <http://mtlab.ecn.fpu.ac.jp/WSM_1996/960823202241.html>

[8002] 
[[WinIE]] は (いつもなのか条件付なのか知りませんが) [[IRI]] を[[百分率符号化]]せずに
[CODE(ABNF)@en[[[Request-URI]]]] に使って送ってきます。

[FIG(quote)[
[FIGCAPTION[
[8027] RFC 2326 (RTSP) 6.2 Request Header Fields
]FIGCAPTION]

>
[PRE[
  request-header  =          Accept                   ; Section 12.1
                  |          Accept-Encoding          ; Section 12.2
                  |          Accept-Language          ; Section 12.3
                  |          Authorization            ; Section 12.5
                  |          From                     ; Section 12.20
                  |          If-Modified-Since        ; Section 12.23
                  |          Range                    ; Section 12.29
                  |          Referer                  ; Section 12.30
                  |          User-Agent               ; Section 12.41
]PRE]

> Note that in contrast to HTTP/1.1 [2], RTSP requests always contain
the absolute URL (that is, including the scheme, host and port)
rather than just the absolute path.

[1] [[HTTP/1.1]] とは異なり、 [[RTSP]] [[要求]]は常に[[絶対経路]]だけではなくて絶対 [[URL]] を
(つまり、 [[scheme]], [[host]], [[port]] を含めて)
指定することに注意して下さい。

> HTTP/1.1 requires servers to understand the absolute URL, but
clients are supposed to use the Host request header. This is purely
needed for backward-compatibility with HTTP/1.0 servers, a
consideration that does not apply to RTSP.

[2] HTTP/1.1 はサーバーが絶対 URL
を理解することを要求していますが、
クライアントは [CODE(HTTP)[Host]] 頭を使うことを想定しています。
これは単に [[HTTP/1.0]] サーバーとの後方互換性からの必要であって、
RTSP では考慮する必要はないのです。

> The asterisk "*" in the Request-URI means that the request does not
apply to a particular resource, but to the server itself, and is only
allowed when the method used does not necessarily apply to a
resource.  One example would be:

[3] Request-URI での星印 [CODE(char)[[[*]]]]
は、要求が特定の資源には適用されるのではなく、
サーバー自体に適用され、使用している [[method]]
が必ずしも資源に適用される物ではない時にのみ認められます。
一つの例を次に示します。

> OPTIONS * RTSP/1.0
]FIG]

** S-HTTP

[12] [[S-HTTP]] では常に [CODE(HTTP)[[[*]]]] とすることとなっていました [SRC[>>13]]。

;; 実際の[[要求URL]]は[[カプセル化]]された[[HTTPメッセージ]]側に指定することとなっていました。

[REFS[
- [13] [CITE@en[RFC 2660 - The Secure HyperText Transfer Protocol]] ([TIME[2014-11-09 14:12:37 +09:00]] 版) <http://tools.ietf.org/html/rfc2660#section-2.2>
]REFS]

** RFC 2109、RFC 2965 における定義

[8003] [[RFC 2109]]、[[RFC 2965]] における[DFN[request-URI]]
は、[[クライアント]]が[[鯖]]に[[要求行]]の一部として送る [CODE(ABNF)@en[[[absoluteURI]]]]
のうちの [CODE(ABNF)@en[[[abs_path]]]] の部分です。 [SRC[>>8004, >>8005]]

[REFS[
- [8004] [DEL[[[RFC 2109]]]] ([[廃止]]済み)
-- [CSECTION@en[2. TERMINOLOGY]]
- [8005] [[RFC 2965]]
-- [CSECTION@en[1. TERMINOLOGY]]
]REFS]

;; [8007] 関連して [[request-host]] という用語があります。

[8006] つまり、[[RFC 2109]]、[[RFC 2965]] における [[request-URI]]
は [[URL]] の [[path]] の部分だけ ([[scheme]] や [[host]] や [[query]] は含まない)
ということですね。

** HSTS

>
[8014] 
:Request URI:
is the URI used to cause a UA to issue an HTTP request message.
See also "Effective Request URI".

[REFS[
- [8015] [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-13>
]REFS]

** OData

[11] [[OData]] は [CODE(MIME)@en[[[application/http]]]] に含まれる[[要求URL]]
について、 [[HTTP]] 仕様上認められているものの他、
(その [CODE(MIME)@en[[[application/http]]]] より外側の[[URL]]を[[基底URL]]とする) 
[[相対URL]]を指定することを認めています [SRC[>>10]]。

[REFS[
- [10] [CITE[OData Version 4.0 Part 1: Protocol Plus Errata 01]] ([TIME[2014-09-04 16:00:00 +09:00]] 版) <http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part1-protocol.html#_Toc370374937>
]REFS]

* 関連

[8009] [[Digest認証]]で使われる [CODE(HTTP)@en[[[uri]]]] [[引数]]には [[request-URI]]
と同じ値を指定することになっています。

[REFS[
- [8008] [CITE@en[RFC 2069 - An Extension to HTTP : Digest Access Authentication]] ([TIME[2012-02-26 10:05:21 +09:00]] 版) <http://tools.ietf.org/html/rfc2069#page-7>
- [8010] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#page-12>
]REFS]

[8013] [[CGI]] には [CODE(CGI)@en[[[REQUEST_URI]]]] [[メタ変数]] ([[環境変数]]) があります。

[8051] [[要求対象]]の定義には含まれませんが、 [CODE(HTTP)@en[[[Max-Forwards:]]]]
[[ヘッダー]]も暗示的、間接的に[[要求]]が適用される対象を指定するものとなっています。

* メモ

[8052] [CITE[''''''[''''''tech'''''']''''''HTTP GETメソッドのURIの長さ制限を調べてみた - Kazumi007の日記]]
( ([TIME[2014-11-28 17:22:32 +09:00]] 版))
<http://d.hatena.ne.jp/Kazumi007/20090921/1253501500>

[36] [CITE@ja[AWS ALBに長いリクエストURLでGETすると414や500でエラーになる - YOMON8.NET]]
([TIME[2017-10-02 03:09:14 +09:00]])
<http://yomon.hatenablog.com/entry/2017/08/25/012347>

[FIG(quote)[
[FIGCAPTION[
[37] [CITE@en[Configuration • Akka HTTP]]
([TIME[2018-03-27 23:00:57 +09:00]])
<https://doc.akka.io/docs/akka-http/current/configuration.html>
]FIGCAPTION]

>     # Sets the strictness mode for parsing request target URIs.
>     # The following values are defined:
>     #
>     # `strict`: RFC3986-compliant URIs are required,
>     #     a 400 response is triggered on violations
>     #
>     # `relaxed`: all visible 7-Bit ASCII chars are allowed
>     #
>     uri-parsing-mode = strict

]FIG]


[38] [CITE@en[Editorial: url ➡️ URL]]
([[annevk]]著, [TIME[2018-08-17 20:57:19 +09:00]])
<https://github.com/whatwg/fetch/commit/5088fce32b79bd0b22047d30869581f8b7e79be8>