[13] [DFN[[[Script-URI]]]] は、 [[CGI]] の[[メタ変数]]から決定できる、当該[[要求]]の [[URL]]
です。最も単純な場合には[[クライアント]]が[[要求]]した [[URL]] ([CODE[[[Request-URI]]]]) 
と一致しますが、[[トランスポート層プロトコル]]によっては、あるいは[[鯖]]内での [[URL]]
の書き換え処理等によってはそれと異なる値となることもあります。

* 仕様書
[REFS[
- [1] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]]
-- [2] <http://tools.ietf.org/html/rfc3875#section-3.2>
-- [9] '''<http://tools.ietf.org/html/rfc3875#section-3.3>'''
]REFS]

* 定義

[11] [DFN[script-URI]] は次のように定義されています [SRC[>>9]]。

[PRE(ABNF code)[
      script-URI = <scheme> "://" <server-name> ":" <server-port>
                   <script-path> <extra-path> "?" <query-string>
]PRE]

- [CODE(ABNF)@en[<scheme>]] は [CODE(CGI)@en[[[SERVER_PROTOCOL]]]] から決まる値
- [CODE(ABNF)@en[<server-name>]] は [CODE(CGI)@en[[[SERVER_NAME]]]] の値
- [CODE(ABNF)@en[<server-port>]] は [CODE(CGI)@en[[[SERVER_PORT]]]] の値
- [CODE(ABNF)@en[<script-path>]] は [CODE(CGI)@en[[[SCRIPT_NAME]]]] は 
[CODE(URI)@en[[[;]]]], [CODE(URI)@en[[[=]]]], [CODE(URI)@en[[[?]]]] を[[予約]]して[[パーセント符号化]]した値
- [CODE(ABNF)@en[<extra-path>]] は [CODE(CGI)@en[[[PATH_INFO]]]] は 
[CODE(URI)@en[[[;]]]], [CODE(URI)@en[[[=]]]], [CODE(URI)@en[[[?]]]] を[[予約]]して[[パーセント符号化]]した値
- [CODE(ABNF)@en[<query-string>]] は [CODE(CGI)@en[[[QUERY_STRING]]]] の値

[12] [[URL scheme]] は [[CGI/1.1]] [[RFC]] の範囲内の[[メタ変数]]では決定できません。
[[HTTP]] の場合、純粋な [[HTTP]] ([CODE(URI)@en[[[http:]]]]) と [[TLS]] 上の [[HTTP]]
([CODE(URI)@en[[[https:]]]]) を区別する方法がありません。
[[CGIスクリプト]]は [[URL scheme]] 依存の[[メタ変数]]を使ってこれを推定しても[['''構いません''']]
[SRC[>>9]]。

* URL scheme

[3] [[CGI]] 仕様は [[URL scheme]] を特に限定していません。

[4] ただし[[非階層的URL scheme]]の対応は適用範囲外とされています [SRC[>>2]]。

* 処理モデル

** スクリプトの選択

[5] [[鯖]]は、 [[path]] の一部または全部により、実行する [[CGIスクリプト]]を選択します。

[6] この選択の方法は[[鯖]]に委ねられており、 [[path]] の全部を[[ファイル・システム]]に写像する場合もあるでしょうし、
どんな [[path]] であろうと特定の[[CGIスクリプト]]に写像する場合もあるでしょう。

[7] いずれにせよ、 [[path]] のある部分が [[CGIスクリプト]]を識別する時、
[[path]] の残った部分があれば、それは[[CGIスクリプト]]によって解釈されることになります。 [SRC[>>2]]

** Request-URI と Script-URI

[8] [[鯖]]は[[クライアント]]から[[要求]]があった [[URL]] の情報を[[メタ変数]]として設定して
[[CGIスクリプト]]に渡します。この時、元々の [[URL]] から直接導き出される値を設定しなければならないわけではなく、
実装と設定に応じて適当に書き換えた値であっても構いません。
複数の [[path]] が特定の [[CGIスクリプト]]に対応付けされているような場合に、
元々の [[URL]] を使ってもいいですし、正規形にした [[URL]] を使ってもいいですし、
その他適当な方法で導かれた [[URL]] を使っても良いのです。 [SRC[>>9]]

[10] いずれにせよ、 [[Script-URI]] は、それにアクセスすると同じ
[CODE(CGI)@en[[[SCRIPT_NAME]]]], [CODE(CGI)@en[[[PATH_INFO]]]], 
[CODE(CGI)@en[[[QUERY_STRING]]]] で同じ[[CGIスクリプト]]が実行されるようなもの
[WEAK[(になるよう変形されているの)]] で[['''なければなりません''']]。 [SRC[>>9]]

* path

[15] [CODE(CGI)@en[[[SCRIPT_NAME]]]] と [CODE(CGI)@en[[[PATH_INFO]]]] 
は定義上[[パーセント復号]]されていることになっています。そのため [[Script-URI]]
を構成するにあたり再度[[パーセント符号化]]する必要が生じています。
しかし[[パーセント復号]]は不可逆なので、 [[Script-URI]] が大元の [[URL]]
と一致していない可能性があります。

[16] 元々の [[path]] に [CODE(URI)[%25]] が含まれていた場合、[[復号]]された[[メタ変数]]では単独の
[CODE(char)[[[%]]]] になっていて、再度[[パーセント符号化]]しないと [[URL]] としては不適切、
あるいは意味が変わってしまうおそれがありますが、 [[CGI]] の [[RFC]]
における[[パーセント符号化]]の定義が曖昧なためどうするのが正しいのかわかりません。

[17] 元々の [[path]] に[[非ASCII文字]]や[[オクテット列]]を[[パーセント符号化]]したものが含まれていた場合、
[[メタ変数]]には [[ASCII]] でない[[バイト]]が含まれることになります。
[WEAK[(これらの[[メタ変数]]は最終的に [CODE(ABNF)[[[TEXT]]]] を参照していて[[文字符号化]]は[[システム定義]]になっていますが、利用可能な [[path]] を仕様上システムの[[文字符号化]]に制限していると解釈できるかもしれません。)]]
その場合どう[[パーセント符号化]]するべきかは、あまり明確に定義されていません。

* 関連

[14] [[メタ変数]] [CODE(CGI)@en[[[REQUEST_URI]]]] は [[Script-URI]] 
で行われるような書き換えと分解の処理を経ていない、元々[[要求]]された [[URL]]
が入っています。こちらの方が正確でより使い勝手が良い場面も多いです。
ただし、 [[host]] が含まれるか否かなど、[[クライアント]]の[[要求]]の方法によって得られる値が変わってくることもあり、
[[鯖]]によって正規化されている [[Script-URI]] に比べて取り扱いに注意が必要です。

[18] [[CGI]] における[[スクリプトURL]]は、[[HTTP]] における[[実効要求URL]]
と実質的に同じものです。ただし、 [[HTTP]] [[要求]]に含まれる [[URL]] を[[鯖]]内の処理の過程で変形などしているなら、
[[スクリプトURL]]は元の[[要求]]の[[URL]]とは直接関係ないものに変わっているかもしれませんから、
その場合[[スクリプトURL]]と[[実効要求URL]]は一致しません。