[8] [[CGI]] の[[メタ変数]] [DFN[[CODE(CGI)@en[[[PATH_INFO]]]]]] は、[[Script-URI]] の [[path]] のうち、[[CGIスクリプト]]によって解釈されるべき部分を[[パーセント復号]]したものです。 * 仕様書 [REFS[ - [6] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]] ([TIME[2011-11-20 06:09:05 +09:00]] 版) ]REFS] * 意味 [9] [CODE(CGI)@en[[[PATH_INFO]]]] は、[[CGIスクリプト]]によって返されるべき[[資源]]・[[部分資源]]を識別するものです [SRC[>>6]]。 * 構文 [10] 値の構文は次のように定義されています [SRC[>>6]]。 [PRE(ABNF code)[ PATH_INFO = "" | ( "/" path ) path = lsegment *( "/" lsegment ) lsegment = *lchar lchar = ]PRE] ;; [11] つまり実質的に [CODE(URI)[[[/]]]] からはじまる任意の[[文字列]]が認められています。 [12] [CODE(CGI)@en[[[PATH_INFO]]]] は元の [[URL]] の [[path]] のうち[[CGIスクリプト]]を識別する部分の後に続く部分から決まる値です。 [[パーセント符号化]]されておらず、 [[path-segment]] に[[引数]]は認められていません。 [SRC[>>6]] ;; [13] [[path-segment]] の[[引数]]は仕様上は存在しますが、実際には [[path-segment]] の不透明な一部分として特別扱いされずにいるように思えます。 [[HTTP]] 仕様との整合性で >>12 のような言及があるのでしょうが、実効性のある規定かは疑問です。 [14] [[大文字]]と[[小文字]]は区別され、元の状態を保存しなければ[['''なりません''']] [SRC[>>6]]。 [15] [[鯖]]は [CODE(CGI)@en[[[PATH_INFO]]]] の値に更に制限を課し、それに反するものを[[誤り]]としても[['''構いません''']] [SRC[>>6]]。 [EG[ [16] 例えば [CODE(URI)[%2F]] と [CODE(URI)[[[/]]]] の区別が[[パーセント復号]]によって失われるので、 これを[[誤り]]としてはじいて [[CGIスクリプト]]に引き渡さなくても構いません。 ]EG] [17] [[非ASCII文字]]の扱いは[[システム定義]]です。 [SRC[>>6]] * 歴史 [FIG(quotation)[ [FIGCAPTION[ [7] 6.1.6. PATH_INFO (経路情報) (CGI/1.1 draft 03) ]FIGCAPTION] > The PATH_INFO metavariable specifies a path to be interpreted by the CGI script. It identifies the resource or sub-resource to be returned by the CGI script, and it is derived from the portion of the URI path following the script name but preceding any query data. The syntax and semantics are similar to a decoded HTTP URL 'path' token (defined in RFC 2396 [4]), with the exception that a PATH_INFO of "/" represents a single void path segment. PATH_INFO (経路情報) メタ変数には、 CGI スクリプトにより解釈される 経路を指定します。これは CGI スクリプトが返す資源または副資源を 識別するものであり、 URI 経路のうちスクリプト名に続く、 問合せ (query) データの前の部分から得たものです。 構文と意味は復号した HTTP URL 「path」(経路)字句 (RFC 2396 で定義) と同様ですが、例外として 「/」という PATH_INFO は 単一空経路部分を表します。 PATH_INFO = "" | ( "/" path ) path = segment *( "/" segment ) segment = *pchar pchar = The PATH_INFO string is the trailing part of the component of the Script-URI (see section 3.2) that follows the SCRIPT_NAME portion of the path. PATH_INFO 文字列は [[Script-URI]] (第3.2節参照) の (経路) 部品の、 [[SCRIPT_NAME]] 部分の後の部分です。 Servers MAY impose their own restrictions and limitations on what values they will accept for PATH_INFO, and MAY reject or edit any values they consider objectionable before passing them to the script. サーバーは PATH_INFO にいかなる値を受け付けるかという自身の制限を 課しても'''構いません'''し、スクリプトに渡す前に宜しくないと思う 値を却下したり編集したりしても'''構いません'''。 Servers MUST make this URI component available to CGI scripts. The PATH_INFO value is case-sensitive, and the server MUST preserve the case of the PATH_INFO element of the URI when making it available to scripts. サーバーはこの URI 部品を CGI スクリプトから利用可能にし '''なければなりません'''。 PATH_INFO 値は大文字・小文字を区別し、 サーバーはスクリプトから利用可能とする時に、 URI の PATH_INFO 要素の大文字・小文字を保存し'''なければなりません'''。 * License [[RFCのライセンス]] ]FIG] * 関連 [20] [CODE(CGI)@en[[[PATH_INFO]]]] を[[ファイル・システム]]上の [[path]] に写像した [CODE(CGI)@en[[[PATH_TRANSLATED]]]] も存在します。 *メモ - [1] [NCSA] ではこの変数はサーバーが ([[URI符号化]]を) 復号した値にするべき (should) と述べていましたが、 [COAR 03] は何も述べていません。しかしながら、 CGI メタ変数から URI を作る節で [CODE(CGI)[PATH_INFO]] を URI 符号化した値を使うことになっていますから、暗黙のうちに復号を要求しています。 - [2] 実際には [[Apache]] はじめどの実装も復号するはずです。たぶん。 [18] 当初 [[CGIスクリプト]]への引数は [CODE(CGI)@en[[[QUERY_STRING]]]] から受け取るのが一般的でしたが、 2000年代の初め頃からそのような [[URL]] は汚いものとみなされるようになり、 しばしば [CODE(CGI)@en[[[PATH_INFO]]]] が使われるようになっていきました。 その場合であっても本来は [[path]] の一部として[[資源]]を識別するとみなせるものは [CODE(CGI)@en[[[PATH_INFO]]]] に、それ以外は引き続き [CODE(CGI)@en[[[QUERY_STRING]]]] に含めるのが意味的には正しいのでしょうが、 [CODE(CGI)@en[[[QUERY_STRING]]]] を過度に忌避して [CODE(CGI)@en[[[PATH_INFO]]]] に無理に詰め込むような使い方をする人も出てきました。 [3] [[IIS]] は正しい [CODE(CGI)[PATH_INFO]] をくれないことがあるそうです。 [19] [[パーセント復号]]するという仕様は [[CGIスクリプト]]の手間や実装漏れの発生を[[鯖]]側で吸収しようとしたものでしょう。 手軽に[[CGIスクリプト]]を書くためにはそれも良かったのでしょうが、正確な[[Request-URI]] を[[CGIスクリプト]]側で決定できないことによる [[URL]] 設計の制約などから、 現在では不便な仕様と考えられることが多いようです。 [5] [CITE[Apache2 + mod_perl2 の仕様と正しく mod_perl2 を使うための方法 - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech]] ([TIME[2010-12-22 10:30:07 +09:00]] 版)