REQUEST_URI

メタ変数 REQUEST_URI (CGI)

[1] CGIメタ変数 REQUEST_URI には、クライアントから送られてきた要求Request-URI (最初の行の真ん中に書かれる URI参照の一部または全部 (どの部分かはプロトコルの仕様によります。)) の値が入ります。

仕様書

Request-URI

[13] このメタ変数は、 SIP の CGI では標準化されています (RFC 3050) が、 HTTP の CGI では標準ではありません。 SCRIPT_NAMEQUERY_STRING などから再構成できる (できた) からです。しかし、 実際の HTTP CGI スクリプトの処理では本当にクライアントから送られてきた Request-URI がそのまま手に入ると便利なことが多々あります (>>6)。 そのためかどうかは存じませんが、 Apache などは REQUEST_URI も提供してくれます。

[6] REQUEST_URI がないと、

ので不便なことがあります。

[5] メタ変数 REQUEST_URI は HTTP CGI では非標準ながらも一定の地位を得ており、 デファクト標準と見なしてよいのではないでしょうか。 しかし、標準でない以上実装していない鯖を責めることは当然できません。 CGIスクリプトREQUEST_URI があればこれを利用し、なければ他のメタ変数を組合せるのがよいでしょう。

[19] HTTP::Request::AsCGI要求URLpathqueryREQUEST_URI とします。

[17] WSGI やその派生仕様には明示的に含まれていませんが、 PSGI では明示的に定義されています。パーセント復号するべきではないと規定されています。 >>16

[20] OPTIONS 要求要求対象* の時、 REQUEST_URI をどう設定するべきかは定かではありません。

歴史

[16] RFC 3050 (SIP-CGI/1.1) 5.5.1.13 REQUEST_URI

This metavariable is specific to requests made with SIP.

このメタ変数は、 SIP で作られた要求に特有です。

        REQUEST_URI  =  absoluteURI  ; defined in RFC 2396 [9]

If the message triggering the script was a request, this variable indicates the URI specified with the request method. This metavariable is only defined if REQUEST_METHOD is defined; in that case, servers MUST provide it to scripts.

スクリプトの引き金となったメッセージが要求である時には、 この変数は要求 method と一緒に指定された URI を示します。このメタ変数は REQUEST_METHOD が定義されている時のみ定義されます。 その場合サーバーはこの変数をスクリプトに提供しなければ なりません

This metavariable fills the roles of HTTP CGI's SCRIPT_NAME, PATH_INFO, and QUERY_STRING.

この変数は、 HTTP CGI での SCRIPT_NAME, PATH_INFO, QUERY_STRING の役割を担っています。

実装

[4] w3mlocal CGI 機能を使って呼出された CGI スクリプトでも REQUEST_URI が得られます。 Apache と似たように、 file:///cgi-bin/foo.cgi なら /cgi-bin/foo.cgi が得られるみたいです。

[10] Apache 2.2.3 の mod_rewrite を使っているのですが、RewriteRule そのものでもその中で参照する REQUEST_URI (%{REQUEST_URI}, %{ENV:REQUEST_URI}) でも、 %2B+percent-decode されてしまいます。(同じ Apache でも CGI の中で REQUEST_URI を参照するとちゃんと %2B のままになっています。)

[11] >>10 SetEnvIf なら正しい REQUEST_URI がとれるので、そこで値を取得して、 RewriteRule の中でその環境変数query に埋め込む (path だと余計に percent-encode されるからだめ!) というまわりくどいことをしたら回避できましたwwwwww ただしこの版の Apache では [E] オプションを指定できないので、 percent-encode されないで query に埋め込まれますwwwww

[12] HTTP::Request::AsCGI もこのメタ変数を設定します。

メモ

[3] HTTP CGI スクリプトの作者は、この CGI メタ変数が現時点では非標準のものであることに注意するべきです。この変数が色々な環境で将来にわたって利用可能かどうかは未知数ですから、得られなかった場合は PATH_INFO とか QUERY_STRING とかで代替する策を練っとかないといけません。もっとも、 SIP CGI で標準化された以上、 HTTP CGI でもこのメタ変数を使わないのも惜しいってものです(謎)。

[18] HTTP/2 には要求行がなく、複数の疑似ヘッダーで表現されますから、 サーバーはその値を組み合わせたものをCGIスクリプトに渡すことになります。 この処理はどこでも規定されていませんから、どのように行われるかは定かではありません。 単純な文字列連結で絶対URLを得たものかもしれませんし、 何らかの正規化が行われるかもしれません。あるいは URL schemeauthority が含まれない可能性もなくはありません。

[21] mod_rewrite - Apache HTTP Server Version 2.5 () <https://httpd.apache.org/docs/trunk/mod/mod_rewrite.html#RewriteCond>

REQUEST_URI

The path component of the requested URI, such as "/index.html". This notably excludes the query string which is available as its own variable named QUERY_STRING.