[1] CGI のメタ変数 REQUEST_URI
には、クライアントから送られてきた要求の
Request-URI
(最初の行の真ん中に書かれる
URI参照の一部または全部
(どの部分かはプロトコルの仕様によります。))
の値が入ります。
[13] このメタ変数は、 SIP の CGI では標準化されています
(RFC 3050) が、 HTTP の CGI では標準ではありません。
SCRIPT_NAME
や QUERY_STRING
などから再構成できる (できた) からです。しかし、
実際の HTTP CGI スクリプトの処理では本当にクライアントから送られてきた
Request-URI
がそのまま手に入ると便利なことが多々あります (>>6)。
そのためかどうかは存じませんが、 Apache などは
REQUEST_URI
も提供してくれます。
[6] REQUEST_URI
がないと、
Script-URI
は得られても
Request-URI
は得られないScript-URI
≒ Request-URI
な場合に限定するとしても、 URI符号化も含めて正確な元の文字列は得られないので不便なことがあります。
[5]
メタ変数 REQUEST_URI
は HTTP CGI では非標準ながらも一定の地位を得ており、
デファクト標準と見なしてよいのではないでしょうか。
しかし、標準でない以上実装していない鯖を責めることは当然できません。
CGIスクリプトは REQUEST_URI
があればこれを利用し、なければ他のメタ変数を組合せるのがよいでしょう。
[19] HTTP::Request::AsCGI
は要求URL の pathquery
を REQUEST_URI
とします。
[17] WSGI やその派生仕様には明示的に含まれていませんが、 PSGI では明示的に定義されています。パーセント復号するべきではないと規定されています。 >>16
[20] OPTIONS
要求で要求対象が *
の時、 REQUEST_URI
をどう設定するべきかは定かではありません。
[4] w3m の local 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 scheme や authority が含まれない可能性もなくはありません。