PDA

View Full Version : Cgi プログラムへ渡される環境変数について


deq
2002/03/30, 07:00 PM
s10 サーバを利用させていただいています.
良質な Web ホスティングサービスをありがとうございます.

CGI プログラム実行時に設定される環境変数について 2 件要望があります.
なお以下の文中にでてくる CGI/1.1 仕様書 draft 03 および CGI/1.2 仕様書 draft は以下の URL において参照することができます.
CGI/1.1 <http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html>
CGI/1.2 <http://cgi-spec.golux.com/cgi-120-00a.html>


1 件目は,広告が自動挿入される場合は環境変数 SERVER_PROTOCOL の値が INCLUDED に設定されることです.
サンプル: http://deq.s10.xrea.com/envtest/test.cgi

この現象は *.cgi という CGI プログラムには影響しますが,*.xcg や x/*.cgi といった CGI プログラムには影響しないので,この現象は広告が自動挿入されたときの処理によって引き起こされているものと推測されます.

CGI/1.1 仕様書によると,6.1.17. SERVER_PROTOCOL において,

| A well-known extension token value is "INCLUDED", which signals that
| the current document is being included as part of a composite document,
| rather than being the direct target of the client request.

とあります.
抽象的な表現ですが,簡単に言うとこれは SSI で呼ばれたスクリプトには INCLUDED が設定されるということです.確かに広告が自動挿入されたドキュメントは "広告" と "CGIの出力" の 2 部分の合成によって成り立ったものであり,部分要素である "CGIの出力" を担当する CGI プログラムにはこの INCLUDED が設定されるべきなのかもしれません.
しかし,考慮すべき点がいくつかあります.それは,

1. 多くの配布スクリプトの制作者は,そのスクリプトを SSI ではなく CGI プログラムとして (すなわち INCLUDED でないものとして) 実行されるものと仮定している
この点において,現実的な問題としては,Perl の CGI モジュールのメソッド url() がこれを参照しており,$cgi->url を使用している全ての CGI プログラムがこの問題を被っています.従って CGI モジュールの url() メソッドを使用している全ての CGI プログラムは,該当部分を改造しなければ *.cgi として動作させることができません.これは非常に移植性を欠き,配布されている Perl の CGI プログラムを xrea.com に設置するのをより困難にしています.
なぜ CGI モジュールが SERVER_PROTOCOL を参照して自身の URL を構築するのかというと,仕様書上で Script URI が [ script-uri = protocol "://" SERVER_NAME ":" SERVER_PORT enc-script enc-path-info "?" QUERY_STRING ] と定義されているからです.従って,仕様書に従って記述された CGI プログラムは,Perl の CGI モジュールに限らずにこの問題を被る可能性があります.

という実用上の点と,

2. CGI/1.2 仕様書では INCLUDED という値は SERVER_PROTOCOL に設定することができない
CGI/1.2 仕様書 では SERVER_PROTOCOL の BNF が "SERVER_PROTOCOL = HTTP-Version | extension-version" となっており,extension-token として例外的に許されていた INCLUDED はもう許されていません.

という仕様上の点です.さらに加えて言うならば,

3. CGI プログラムを INCLUDED として呼ばないようにしてもなんら実用上の被害はないだろう
それらは SSI プログラムではないからです.

ということもあります.
僕としては,実用上の問題 (配布スクリプトの設置の困難性) を解決するために SERVER_PROTOCOL は HTTP/1.1 などの通常通りの値が設定されることを望みます.

一時的なものとして,各 CGI プログラムに一行書けばこの問題を回避することができるプログラムを書きました (Perl 専用).
http://deq.s10.xrea.com/metavariables/server_protocol.pl (Perl 5; EUC-JP/LF)


2 件目は,PATH_INFO による引数渡しのときに環境変数 SCRIPT_NAME が環境変数 PATH_INFO を含むことです.
サンプル: http://deq.s10.xrea.com/envtest/test.cgi/abc

広告の自動表示に関連したパスを扱う処理がバグっているようです (xrea.com さん独自の処理だと思いますが).サンプルで示したように *.cgi では SCRIPT_NAME 内に PATH_INFO の内容が含まれてしまっています.さらにこれは *.xcg でも起こり,*.xcg プログラムが起動されているにも関わらず広告が自動表示されてしまいます.
http://deq.s10.xrea.com/envtest/test.xcg/abc
なおこれらの現象は x/*.cgi や x/*.xcg などの CGI プログラムには影響せず,正常 (SCRIPT_NAME 内に PATH_INFO が含まれない) に動作しています.
http://deq.s10.xrea.com/envtest/x/test.cgi/abc

CGI/1.1 仕様書によると,6.1.14. SCRIPT_NAME において,

| No PATH_INFO or QUERY_STRING segments (see sections 6.1.6 and 6.1.8)
| are included in the SCRIPT_NAME value.

とあり,SCRIPT_NAME 内に PATH_INFO は含まれないことが分かります.
CGI/1.2 仕様書ではなぜかこの部分がなくなっているのですが,3.2. The Script URI,4. Request Metadata (Meta-Variables) 内の PATH_INFO,SCRIPT_NAME の各項目を読むと,やはり SCRIPT_NAME 内に PATH_INFO は含まれないと解釈できます.
従って,

1. 現在の処理は CGI/1.1 および CGI/1.2 仕様書を満たさない動作である

と言えます.そして現在の処理がもたらす問題は,先にあげたように,

2. .xcg 拡張子であっても PATH_INFO 形式による引数渡しで広告が表示されてしまう

という点,そして

3. PATH_INFO と SCRIPT_NAME の両方を利用している CGI プログラムが動作しないか,あるいは誤動作する可能性がある

という点です.
この問題は明らかにバグですので,修正して頂きたいと思います.

一時的なものとして,各 CGI プログラムに一行書けばこの問題を回避することができるプログラムを書きました (Perl 専用).
http://deq.s10.xrea.com/metavariables/path_info.pl (Perl 5; EUC-JP/LF)


以上,よろしくお願いします.

webmaster
2002/04/01, 01:19 AM
サポートです。

現在、自動広告にする場合の処理として
出力結果を全てSSIとみなし、BODYタグを検索するという手順を取っています。

ですので、画像が表示できないなど問題があります。ご指摘の問題もあります。

問題が生じる場合は、非常手段としてディレクトリ「x」を使用して下さい。

全体的なサーバー設定は、追々改善致します。

deq
2002/04/01, 07:12 PM
なるほど.

「画像が表示できない問題」というのは僕は経験していないのでよく分かりませんが... ( ここを利用させていただき初めて 2 週間ていどなので(^^; )

問題が生じる場合は、非常手段としてディレクトリ「x」を使用して下さい。

はい.

この 2 つの環境変数の問題を解決するのに,x ディレクトリ内に設置し各 CGI プログラムを改造して広告用のコードを書くのが面倒な方のために,Perl および Ruby で利用できるユーティリティプログラムを書きました.
動作の保証はしませんが,利用したいかたは利用してください.
http://deq.s10.xrea.com/metavariables/

お返事ありがとうございます.

usopion
2002/04/01, 08:46 PM
Originally posted by deq

この 2 つの環境変数の問題を解決するのに,x ディレクトリ内に設置し各 CGI プログラムを改造して広告用のコードを書くのが面倒な方のために,Perl および Ruby で利用できるユーティリティプログラムを書きました.
動作の保証はしませんが,利用したいかたは利用してください.
http://deq.s10.xrea.com/metavariables/

ふむふむ。よー分からんけど(ぉぃ
↓ここでも紹介してはいかがでせう。
http://sb.xrea.com/showthread.php?s=&threadid=693