<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メタ変数</anchor> <dfn><code class="CGI">REQUEST_URI</code></dfn>
には、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント</anchor>から送られてきた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>の
<code class="ABNF"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Request-URI</anchor></code> (最初の行の真ん中に書かれる
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URI参照</anchor>の一部または全部 
(どの部分かはプロトコルの仕様によります。))
の値が入ります。</p><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 3050</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SIP CGI</anchor>)</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <cite>PSGI - search.cpan.org</cite> (<time>2012-02-16 22:39:56 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://search.cpan.org/dist/PSGI/PSGI.pod#The_Environment">http://search.cpan.org/dist/PSGI/PSGI.pod#The_Environment</anchor-external></li></ul></refs></section><section><h1>Request-URI</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> このメタ変数は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SIP</anchor> の CGI では標準化されています
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 3050</anchor>) が、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> の CGI では標準ではありません。
<code class="CGI"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SCRIPT_NAME</anchor></code> や <code class="CGI"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">QUERY_STRING</anchor></code>
などから再構成できる (できた) からです。しかし、
実際の HTTP CGI スクリプトの処理では本当にクライアントから送られてきた
<code class="ABNF">Request-URI</code> がそのまま手に入ると便利なことが多々あります (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal>)。
そのためかどうかは存じませんが、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Apache</anchor> などは
<code class="CGI">REQUEST_URI</code> も提供してくれます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <code class="CGI">REQUEST_URI</code> がないと、<ul><li><code class="ABNF"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Script-URI</anchor></code> は得られても
<code class="ABNF">Request-URI</code> は得られない</li><li><code class="ABNF">Script-URI</code> ≒ <code class="ABNF">Request-URI</code>
な場合に限定するとしても、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URI符号化</anchor>も含めて正確な元の文字列は得られない</li><li>複数のメタ変数を組合せるのは面倒い</li></ul></p><p>ので不便なことがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end>
メタ変数 <code class="CGI">REQUEST_URI</code>
は HTTP CGI では非標準ながらも一定の地位を得ており、
デファクト標準と見なしてよいのではないでしょうか。
しかし、標準でない以上実装していない鯖を責めることは当然できません。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGIスクリプト</anchor>は <code class="CGI">REQUEST_URI</code>
があればこれを利用し、なければ他のメタ変数を組合せるのがよいでしょう。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> <code class="perl" xml:lang="en">HTTP::Request::AsCGI</code> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求URL</anchor> の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">pathquery</f>
を <code class="CGI" xml:lang="en">REQUEST_URI</code> とします。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WSGI</anchor> やその派生仕様には明示的に含まれていませんが、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor>
では明示的に定義されています。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">パーセント復号</anchor>するべきではないと規定されています。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;16</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <code class="HTTP" xml:lang="en">OPTIONS</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求対象</anchor>が <code>*<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">要求対象</title></code>
の時、 <code class="CGI" xml:lang="en">REQUEST_URI</code> をどう設定するべきかは定かではありません。</p></section><section><h1>歴史</h1><figure class="quote"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> RFC 3050 (SIP-CGI/1.1) 5.5.1.13 REQUEST_URI</figcaption><blockquote><p>This metavariable is specific to requests made with SIP.</p></blockquote><p>このメタ変数は、 SIP
で作られた要求に特有です。</p><pre>        REQUEST_URI  =  absoluteURI  ; defined in RFC 2396 [9]</pre><blockquote><p>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.</p></blockquote><p>スクリプトの引き金となったメッセージが要求である時には、
この変数は要求 method
と一緒に指定された <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URI</anchor>
を示します。このメタ変数は
<code class="CGI"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">REQUEST_METHOD</anchor></code>
が定義されている時のみ定義されます。
その場合サーバーはこの変数をスクリプトに提供しなければ <strong>なりません</strong>。</p><blockquote><p>This metavariable fills the roles of HTTP CGI's
SCRIPT_NAME, PATH_INFO, and 
QUERY_STRING.</p></blockquote><p>この変数は、 HTTP CGI
での <code class="CGI"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SCRIPT_NAME</anchor></code>,
<code class="CGI"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PATH_INFO</anchor></code>,
<code class="CGI"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">QUERY_STRING</anchor></code>
の役割を担っています。</p></figure></section><section><h1>実装</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">w3m</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">local CGI</anchor> 機能を使って呼出された CGI スクリプトでも <code class="CGI">REQUEST_URI</code> が得られます。 Apache と似たように、 <code class="URI">file:///cgi-bin/foo.cgi</code> なら <code class="URI">/cgi-bin/foo.cgi</code> が得られるみたいです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Apache</anchor> 2.2.3 の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mod_rewrite</anchor> を使っているのですが、<code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RewriteRule</anchor></code>
そのものでもその中で参照する <code class="CGI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">REQUEST_URI</anchor></code> 
(<code xml:lang="en">%{<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">REQUEST_URI</anchor>}</code>, <code xml:lang="en">%{ENV:<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">REQUEST_URI</anchor>}</code>) でも、
<code class="URI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">%2B</anchor></code> が <code class="char"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">+</anchor></code> に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">percent-decode</anchor>
されてしまいます。(同じ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Apache</anchor> でも <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI</anchor>
の中で <code class="CGI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">REQUEST_URI</anchor></code> を参照するとちゃんと <code class="URI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">%2B</anchor></code>
のままになっています。)</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;10</anchor-internal> <code xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SetEnvIf</anchor></code> なら正しい <code class="CGI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">REQUEST_URI</anchor></code>
がとれるので、そこで値を取得して、 <code xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RewriteRule</anchor></code>
の中でその<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">環境変数</anchor>を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">query</anchor> に埋め込む (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path</anchor> だと余計に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">percent-encode</anchor>
されるからだめ!) というまわりくどいことをしたら回避できましたwwwwww
ただしこの版の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Apache</anchor> では [E] オプションを指定できないので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">percent-encode</anchor> されないで <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">query</anchor> に埋め込まれますwwwww</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP::Request::AsCGI</anchor> もこの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メタ変数</anchor>を設定します。</p></section><section><h1>例</h1><ul><li>HTTP CGI<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <samp class="CGI">/path/to/cgi/path/info?query</samp></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <samp class="CGI">http://foo.example/path</samp></li></ul></li><li>SIP CGI<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <samp class="CGI">sip:foo@bar.example</samp></li></ul></li></ul></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> HTTP CGI スクリプトの作者は、この CGI メタ変数が現時点では非標準のものであることに注意するべきです。この変数が色々な環境で将来にわたって利用可能かどうかは未知数ですから、得られなかった場合は <code class="CGI"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PATH_INFO</anchor></code> とか <code class="CGI"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">QUERY_STRING</anchor></code> とかで代替する策を練っとかないといけません。<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">もっとも、 SIP CGI で標準化された以上、 HTTP CGI でもこのメタ変数を使わないのも惜しいってものです(謎)。</weak></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/2</anchor> には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求行</anchor>がなく、複数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">疑似ヘッダー</anchor>で表現されますから、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>はその値を組み合わせたものを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGIスクリプト</anchor>に渡すことになります。
この処理はどこでも規定されていませんから、どのように行われるかは定かではありません。
単純な文字列連結で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">絶対URL</anchor>を得たものかもしれませんし、
何らかの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規化</anchor>が行われるかもしれません。あるいは <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL scheme</anchor>
や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">authority</anchor> が含まれない可能性もなくはありません。</p><figure class="quote"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> <cite xml:lang="en">mod_rewrite - Apache HTTP Server Version 2.5</cite>
(<time>2017-08-18 17:24:45 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://httpd.apache.org/docs/trunk/mod/mod_rewrite.html#RewriteCond">https://httpd.apache.org/docs/trunk/mod/mod_rewrite.html#RewriteCond</anchor-external></figcaption><blockquote><p>REQUEST_URI</p><p>The path component of the requested URI, such as &quot;/index.html&quot;. This notably excludes the query string which is available as its own variable named QUERY_STRING.</p></blockquote></figure></section></body></html>