#?SuikaWiki/0.9 [1] [[CGI]] の[DFN[メタ変数]] (metavariable(s)) は、 [[サーバー]]から[[スクリプト]]に情報を提供するために使用されます。 [2] [NCSA] では[[環境変数]]とされていましたが、 [COAR] では CGI の普及を反映して、 より汎用的にメタ変数と呼んでいます。 [[Un|x]] や [[Windoze]] のような環境で、 [[Apache]] や [[IIS]] などを使っている場合など、 ほとんどの場合においてはメタ変数の手段として環境変数が使われますから、 現在でも環境変数で情報を伝えていると表現することは間違いではありませんが、 特に実装に依存した話をする場合以外は [COAR] を尊重してメタ変数と呼ぶのがよいとおもいます。 [[RFC3050]] もメタ変数と呼んでいます。 [3] メタ変数は、サーバーから CGI スクリプトへの情報伝達にのみ使われます。 変数の値を変更しても、サーバーの動作などに影響は出ません。 (メタ変数の手段によっては変更すること自体できないかもしれません。) [4] メタ変数の値が長さ1以上でない場合には、 「長さ0の(空)文字列」が設定されている場合 ([CODE(CGI)[NULL]] という。) と値が設定されていない (未定義である) 場合があります。 HTTP CGI では歴史的に両者を基本的には区別しませんが、 SIP CGI ではその区別を要求しています。 HTTP CGI であっても、 [CODE(CGI)[NULL]] と値なしは 「実装依存」であって、 適当でよいわけではありません。 例えばサーバーはある時 [CODE(CGI)[QUERY_STRING]] が [7] メタ変数: -●・・・サーバーは必ず提供''しなければならない''。 (場合によってはしなければならない、を含む。) -◎・・・サーバーは提供する''べき''である。 -○・・・定義されている。(提供しても''よい''。) ,1.1,SIP,名前 ,その他の実装 , , ,[[ALL_HTTP]] , , ,[[AUTH_PASS]] ,◎,●,[[AUTH_TYPE]] , , , ,[[AUTH_USER]] , , ,[[CERT_ISSUER]] , , ,[[CERT_SUBJECT]] , , ,[[CLIENT_CERT_ENCODING]] ,●,●,[[CONTENT_LENGTH]] ,●,●,[[CONTENT_TYPE]] , , ,[[DATE_GMT]] ,[SSI] , , ,[[DATE_LOCAL]] ,[SSI] , , ,[[DOCUMENT_NAME]] ,[SSI] , , ,[[DOCUMENT_PATH_INFO]] ,[SSI] , , ,[[DOCUMENT_ROOT]] ,[Apache] , , ,[[DOCUMENT_URI]] ,[SSI] , , ,[[FCGI_DATA_LENGTH]] ,[FastCGI] , , ,[[FCGI_LISTEN_QUEUE]] ,[FastCGI] , , ,[[FCGI_PROCESS_ID]] ,[FastCGI] , , ,[[FCGI_ROLE]] ,[FastCGI] , , ,[[FCGI_SOCKET_PATH]] ,[FastCGI] , , ,[[FILE_LAST_MOD]] ,[FastCGI] ,●,●,[[GATEWAY_INTERFACE]] ,◎, ,[[HTTP_*]] , , ,[[LAST_MODIFIED]] ,[SSI] ,● ,,[[PATH_INFO]] ,○, ,[[PATH_TRANSLATED]] ,●, ,[[QUERY_STRING]] , , ,[[QUERY_STRING_UNESCAPED]] ,[SSI] , , ,[[REDIRECT_PATH]] ,* , , ,[[REDIRECT_QUERY_STRING]] ,* , , ,[[REDIRECT_STATUS]] ,[Apache]* , , ,[[REDIRECT_URL]] ,[Apache]* , ,??,[[REGISTRATIONS]] ,●,●,[[REMOTE_ADDR]] ,◎,◎,[[REMOTE_HOST]] ,○,○,[[REMOTE_IDENT]] , , ,[[REMOTE_PASSWORD]] , , ,[[REMOTE_PORT]] ,[Apache] ,○,◎,[[REMOTE_USER]] ,●,●,[[REQUEST_METHOD]] , ,??,[[REQUEST_TOKEN]] , ,●,[[REQUEST_URI]] ,[Apache] , ,●,[[RESPONSE_REASON]] , ,??,[[RESPONSE_STATUS]] , ,??,[[RESPONSE_TOKEN]] , ,??,[[SCRIPT_COOKIE]] , , ,[[SCRIPT_FILENAME]] ,[Apache] ,●, ,[[SCRIPT_NAME]] , , ,[[SERVER_ADDR]] , , ,[[SERVER_ADMIN]] ,[Apache] ,●,●,[[SERVER_NAME]] ,●,●,[[SERVER_PORT]] , , ,[[SERVER_PORT_SECURE]] ,●,●,[[SERVER_PROTOCOL]] , , ,[[SERVER_SIGNATURE]] ,[Apache] ,●,●,[[SERVER_SOFTWARE]] , ,◎,[[SIP_*]] , , ,[[URL]] , , ,[[USER_NAME]] ,[Apache]* , , ,[[W3M_*]] ,[w3m] ,○, ,[[X_*]] - 1.1 == HTTP CGI/1.1 - SIP == SIP-CGI/1.1 - [SSI] == SSI (参考) - [Apache]* == Apache (CGI とは直接関係ない機能) -[w3m] == w3m [[LocalCGI]] サーバーはスクリプトにメタ変数を渡す方法を用意し''なければなりません''。 多くの実装では[[環境変数]]として渡されます。 メタ変数名の大文字・小文字は区別しません。正統名は 大文字と「_」で構成されますが、実際の名前は処理系統定義です。 (メタ変数値の大文字・小文字の区別は変数により異なります。) - [9] [CODE(CGI)[SCRIPT_FILENAME]], [CODE(CGI)[REQUEST_URI]]: [[Apache]] 拡張 - [10] [CODE[[[DOCUMENT_ROOT]]]]: しばしば [CODE[CGI 環境変数]]として取り上げられますが、これは CGI のメタ変数ではありません。単なるサーバーが使用又は提供しているだけの変数です。 -- [15] >>10 でも Apache がこの環境変数に依存しているとはおもえないから、 CGI script への情報提供として値を設定しているのかな、やっぱり。 - [12] 変数 [CODE[[[SERVER_PORT_SECURE]]]] はおそらく [[HTTPS]] を使った時のものです。 CGI/1.1,1.2dらft には載っていませんが、サーバー独自拡張のメタ変数と考えても良い部類でしょう。 - [13] [CODE(CGI)[[[SERVER_ADMIN]]]]: 管理者のメイル・アドレス。非標準だけど [[Apache]] とかで普通に使われている。 - [14] よく [CODE[CGI 環境変数]]として取り上げられるが CGI とは関係のない (たまたま設定されているだけの) 変数: [CODE[[[PATH]]]], [CODE[[[TZ]]]], - [16] [CODE(CGI)[[[REMOTE_PASSWORD]]]]: こんな (便利な) CGI の思想とは反する変数を与えるサーバーはどこのあほで巣かな? - [17] Apache の環境変数 。 Apache では挙動の制御に環境変数が使われますが、 CGI の環境変数群が CGI 以外の場面でもしばしば使用出来ます。 - [18] [[WinCGI]] では[[INIファイル]]を使ってメタ変数を渡していたそうです。 (INI のファイル名は CGI スクリプトの第1引数となります。) (WinCGI が他の点でちゃんと CGI に適合するのかは知りませんが。) [[#comment]] * CGI の肝はメタ変数。メタ変数の説明次第で CGI 解説文がトンデモかどうか判断できる。 - [6] よく、「CGI 環境変数の説明」などと称して、色々な[[環境変数]]の一覧を示している文書があります。そしてそのような文書にはたいてい、 [CODE[TZ]] のように''たまたまそのサーバーで設定されていた''だけの環境変数が載っていたりします。筆者がちゃんとわかっているかを判断する一つの材料となります。 - [7] また、 >>6 ほどではありませんが重要なポイントとして、一般的な CGI のめた変数と、 HTTP_[CODE[*]] のめた変数をきちんと区別して扱っているかも要注意でしょう。厳しいことを言えば、このメタ変数群と [[HTTP]] 頭欄の関係に全く触れていなければその時点で HTTP CGI の説明として失格です。 - [11] [CODE[環境変数はブラウザが送る]]と思っている人がいます。仕組みを知らない証拠です。 [[#comment]] * memo