script-URI

スクリプトURL (CGI)

[13] Script-URI は、 CGIメタ変数から決定できる、当該要求URL です。最も単純な場合にはクライアント要求した URL (Request-URI) と一致しますが、トランスポート層プロトコルによっては、あるいは内での URL の書き換え処理等によってはそれと異なる値となることもあります。

仕様書

定義

[11] script-URI は次のように定義されています >>9

      script-URI = <scheme> "://" <server-name> ":" <server-port>
                   <script-path> <extra-path> "?" <query-string>

[12] URL schemeCGI/1.1 RFC の範囲内のメタ変数では決定できません。 HTTP の場合、純粋な HTTP (http:) と TLS 上の HTTP (https:) を区別する方法がありません。 CGIスクリプトURL scheme 依存のメタ変数を使ってこれを推定しても構いません >>9

URL scheme

[3] CGI 仕様は URL scheme を特に限定していません。

[4] ただし非階層的URL schemeの対応は適用範囲外とされています >>2

処理モデル

スクリプトの選択

[5] は、 path の一部または全部により、実行する CGIスクリプトを選択します。

[6] この選択の方法はに委ねられており、 path の全部をファイル・システムに写像する場合もあるでしょうし、 どんな path であろうと特定のCGIスクリプトに写像する場合もあるでしょう。

[7] いずれにせよ、 path のある部分が CGIスクリプトを識別する時、 path の残った部分があれば、それはCGIスクリプトによって解釈されることになります。 >>2

Request-URI と Script-URI

[8] クライアントから要求があった URL の情報をメタ変数として設定して CGIスクリプトに渡します。この時、元々の URL から直接導き出される値を設定しなければならないわけではなく、 実装と設定に応じて適当に書き換えた値であっても構いません。 複数の path が特定の CGIスクリプトに対応付けされているような場合に、 元々の URL を使ってもいいですし、正規形にした URL を使ってもいいですし、 その他適当な方法で導かれた URL を使っても良いのです。 >>9

[10] いずれにせよ、 Script-URI は、それにアクセスすると同じ SCRIPT_NAME, PATH_INFO, QUERY_STRING で同じCGIスクリプトが実行されるようなもの (になるよう変形されているの)なければなりません>>9

path

[15] SCRIPT_NAMEPATH_INFO は定義上パーセント復号されていることになっています。そのため Script-URI を構成するにあたり再度パーセント符号化する必要が生じています。 しかしパーセント復号は不可逆なので、 Script-URI が大元の URL と一致していない可能性があります。

[16] 元々の path%25 が含まれていた場合、復号されたメタ変数では単独の % になっていて、再度パーセント符号化しないと URL としては不適切、 あるいは意味が変わってしまうおそれがありますが、 CGIRFC におけるパーセント符号化の定義が曖昧なためどうするのが正しいのかわかりません。

[17] 元々の path非ASCII文字オクテット列パーセント符号化したものが含まれていた場合、 メタ変数には ASCII でないバイトが含まれることになります。 (これらのメタ変数は最終的に TEXT を参照していて文字符号化システム定義になっていますが、利用可能な path を仕様上システムの文字符号化に制限していると解釈できるかもしれません。) その場合どうパーセント符号化するべきかは、あまり明確に定義されていません。

関連

[14] メタ変数 REQUEST_URIScript-URI で行われるような書き換えと分解の処理を経ていない、元々要求された URL が入っています。こちらの方が正確でより使い勝手が良い場面も多いです。 ただし、 host が含まれるか否かなど、クライアント要求の方法によって得られる値が変わってくることもあり、 によって正規化されている Script-URI に比べて取り扱いに注意が必要です。

[18] CGI におけるスクリプトURLは、HTTP における実効要求URL と実質的に同じものです。ただし、 HTTP 要求に含まれる URL内の処理の過程で変形などしているなら、 スクリプトURLは元の要求URLとは直接関係ないものに変わっているかもしれませんから、 その場合スクリプトURL実効要求URLは一致しません。