[8] CGI のメタ変数 PATH_INFO
は、Script-URI の path
のうち、CGIスクリプトによって解釈されるべき部分をパーセント復号したものです。
PATH_INFO = "" | ( "/" path ) path = lsegment *( "/" lsegment ) lsegment = *lchar lchar = <any TEXT or CTL except "/">
[12] PATH_INFO
は元の URL の path
のうちCGIスクリプトを識別する部分の後に続く部分から決まる値です。
path-segment に引数は認められていません。 >>6
[14] 大文字と小文字は区別され、元の状態を保存しなければなりません >>6。
[15] 鯖は PATH_INFO
の値に更に制限を課し、それに反するものを誤りとしても構いません
>>6。
[17] 非ASCII文字の扱いはシステム定義です。 >>6
[21] NULL (空文字列) の意味は明記されていませんが、 path 全体が CGIスクリプトを識別する場合、
PATH_INFO
は必然的に空になります。
[27] RFC は、値はパーセント符号化されていない >>6 としています。
[1] [NCSA] ではこの変数はサーバーが (URI符号化を) 復号した値にするべき (should) と述べていましたが、 [COAR 03] は何も述べていません。しかしながら、 CGI メタ変数から URI を作る節で PATH_INFO
を URI 符号化した値を使うことになっていますから、暗黙のうちに復号を要求しています。
[2] 実際には Apache はじめどの実装も復号するはずです。たぶん。
[19] パーセント復号するという仕様は CGIスクリプトの手間や実装漏れの発生を鯖側で吸収しようとしたものでしょう。 手軽にCGIスクリプトを書くためにはそれも良かったのでしょうが、正確なRequest-URI をCGIスクリプト側で決定できないことによる URL 設計の制約などから、 現在では不便な仕様と考えられることが多いようです。
[28] HTTP::Request::AsCGI
は、ソースコードのコメントで、
パーセント復号する仕様は問題があるとしつつも、
Apache や lighttpd がそうしているとして、RFC 通りすべてのパーセント符号化を復号しています。
[24] CGIスクリプトは PATH_INFO
を処理するつもりがないときは
404
応答により拒絶するべきです。 >>23
[405] PATH_INFO
や PATH_TRANSLATED
や
SCRIPT_NAME
を扱うときは、空の path segment (//
)
や特別な path segment (.
や ..
)
の扱いに注意するべきです。 OS に渡す必要があるときは削除する、あるいは誤りとして
404
を返すなどの処置を行うべきです。 >>23
CON
など DOS で特別な意味を持つファイル名が含まれるとき、
非ASCII文字などファイル・システムやロケールによって正しく扱えない可能性がある文字が含まれるときなども同様に注意が必要です。
[26] 古い CGIスクリプトを中心に、 PATH_INFO
を気にしていないことがよくあります。
URL に基づくアクセス制御などとの関係で、意図せぬ URL で CGIスクリプトにアクセスできてしまうことは、
セキュリティー上の問題につながるかもしれません。 (そのため >>24 の通り、
利用するつもりがなければ拒むべきです。)
[406] HTTP::Request::AsCGI は与えられた URL の path 全体を PATH_INFO
に含めます。 (SCRIPT_NAME
は /
で固定です。)
[20] PATH_INFO
をファイル・システム上の path
に写像した PATH_TRANSLATED
も存在します。
[18] 当初 CGIスクリプトへの引数は QUERY_STRING
から受け取るのが一般的でしたが、
2000年代の初め頃からそのような URL は汚いものとみなされるようになり、
しばしば PATH_INFO
が使われるようになっていきました。
その場合であっても本来は path の一部として資源を識別するとみなせるものは PATH_INFO
に、それ以外は引き続き QUERY_STRING
に含めるのが意味的には正しいのでしょうが、
QUERY_STRING
を過度に忌避して PATH_INFO
に無理に詰め込むような使い方をする人も出てきました。
[3] IIS は正しい PATH_INFO
をくれないことがあるそうです。
[5] Apache2 + mod_perl2 の仕様と正しく mod_perl2 を使うための方法 - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech ( 版) <http://subtech.g.hatena.ne.jp/cho45/20101221/1292941055>
[25] Twiggy は要求URLとして絶対URLが指定されると、それをすべて
PATH_INFO
とするようです。 (SCRIPT_NAME
は空文字列になります。)
/
からはじまる任意の文字列が認められています。