AN HTTPD ゲストブック/コメント集(2004年9月2日19:36)


(み) age@sage.com 2004/09/05 06:54

>>いとさん
ありがとうございます。
おっしゃるとおりCGIから外部のファイルを取り込むパスが相対パスになっていました。
これをローカルパスに記述しなおしたところ全てのページで問題なく表示されるようになりました。
本当にありがとうございます。


いと gfh05223@nifty.com 2004/09/04 19:04

(み) さん

C:\web\index.shtml
C:\web\script.pl
のときには

<!--#exec cmd="script.pl"-->
だけでなく
<!--#exec cmd="./script.pl"-->
<!--#exec cmd=".\script.pl"-->
<!--#exec cmd="c:/web/script.pl"-->
<!--#exec cmd="c:\web\script.pl"-->
<!--#exec cmd="/web/script.pl"-->
<!--#exec cmd="\web\script.pl"-->
どれでも動作しませんか?

推測するに script.plの中にパスが関係する処理があり、
パスが相対パスで書かれているということはないですか?
例えば
C:\web\test\index.shtml
C:\web\script.pl
<!--#exec cmd="../script.pl"-->

では、カレントディレクトリは C:\web\testになります。
コマンドプロンプトから
C:\web\test>..\script.pl
が動作するように script.pl が作られていないと
C:\web\index.shtml では動作しても
C:\web\test\index.shtml では動作しない
という結果になると思います。

script.plを以下のような簡単なスクリプトに置き換えれば
script.plの位置の問題ではないことが分かると思うのですが。

#!/usr/local/bin/perl
print "Hello!\n";


(み) age@sage.com 2004/09/04 17:23

>>中田さん

ドキュメントルートは C:\web
index.shtmlは C:\web\index.shtml
script.plは C:\web\script.pl

ANHTTPDは C:\Program files\ANHTTPD
ActivePerlは C:\Perl
となっています。

検証のためにscript.plの位置は色々動かしていました。

C:\script.pl
<!--#exec cmd="C:\script.pl"--> ×
<!--#exec cmd="/script.pl"--> ×

C:\src\script.pl
<!--#exec cmd="C:\src\script.pl"--> ×
<!--#exec cmd="/src/script.pl"--> ×

C:\web\src\script.pl
<!--#exec cmd="C:\web\src\script.pl"--> ×

C:\web\test\index.shtml
C:\web\script.pl
<!--#exec cmd="../script.pl"--> ×

C:\web\index.shtml
C:\web\script.pl
<!--#exec cmd="script.pl"--> ○

という結果でした。


中田昭雄 nakata@st.rim.or.jp 2004/09/04 06:49

(み)さん、
ドキュメントルート、script.pl、index.shtml のローカルパスはそれぞれ何ですか?


(み) age@sage.com 2004/09/04 05:02

>>中田さん

相対パスとローカルパスで指定して
いくつかのスクリプトを移動して試しましたが
<!--#exec cmd="../script.pl"-->
<!--#exec cmd="C:\script.pl"-->
<!--#exec cmd="C:\web\script.pl"-->
<!--#exec cmd="C:/script.pl"-->
<!--#exec cmd="C:/web/script.pl"-->
<!--#exec cmd="/script.pl"-->
<!--#exec cmd="/web/script.pl"-->

のいずれもSSIが動作しませんでした。
唯一動いたのが
<!--#exec cmd="script.pl"-->のみです。

同一フォルダのスクリプトしか動かないということは何かをANHTTPDで設定しなければならないのでしょうか?

環境はANHTTPD 1.42mとWindows2000とActiveperl 5.8.4です。
他に何の原因が考えられますでしょうか。


中田昭雄 nakata@st.rim.or.jp 2004/09/03 20:43

(み)さん、
ドキュメントルートをルートとする仮想パスは、#exec cmd="..." では使えません。
#exec cmd はコマンドシェルの呼び出しなので、"..." の中のパスは仮想パスではなくてローカルパス(ローカルファイルシステム上のパス)だからです。

要するに、
#exec cmd="../script.pl"
と相対パスにするのが簡単でしょう。

参考までに追加しておきますと、
たとえばドキュメントルートが C:\root だとすれば、
#exec cmd="C:/root/script.pl"
#exec cmd="C:\root\script.pl"
でもいいですし、ドライブレターは省略できることが多いので、
#exec cmd="/root/script.pl"
#exec cmd="\root\script.pl"
でもよいでしょう。
また、script.pl をドキュメントルートではなくてハードディスク上のルートに置けば、
#exec cmd="/script.pl"
でいいわけです。


(み) age@sage.com 2004/09/02 22:27

>>中田さん
レスありがとうございます。
SSIで呼び出すスクリプトなのですが、ソケットを使う携帯端末向けの16文字ローテーション広告挿入スクリプトです。
これの設置方法に#exec cmdでの呼び出しを指定されているのです。
要はドキュメントルートから見たパスでスクリプトを呼び出したいのですが

root 
- script.pl
- dir1
-index.shtml
このような状態だと仮定して、
index.shtmlから#exec cmd="/script.pl"を指定すると
BlackJumboDogではrootのscript.plが実行され広告が表示されるがANHTTPDでは何も結果が表示されないという結果になっています。
script.plをdir1に移動して#exec cmd="script.pl"は表示されました。
この状態だとscript.plをそれぞれのディレクトリにコピーして実行しかないのですが、
BJDと同じようにそれぞれのページから一つのスクリプトを呼び出したいのです。
それ用の設定が必要なのかと思い質問しました。
無理なら諦めます。


中田昭雄 nakata@st.rim.or.jp 2004/09/02 21:32

(み)さん、
#exec する中身が空行を出力する普通の CGI なのであれば、
#exec cmd=... ではなく、#exec cgi=... を使ってください。

ソケット関数云々の方は、「動作しない」というではわかりませんので、どういうエラーになるのかをお知らせください。エラー500なら、「CGI出力を検査」にチェックを入れて、表示されるエラーメッセージから原因を判断してください。よくわからない場合は、そのエラーメッセージの内容をお知らせください。


(み) age@sage.com 2004/09/02 19:36

An HTTPDでSSIをドキュメントルートからの絶対パスで指定すると動作しません。
バージョンは1.42mです。
カレントでは実行できるのですが <!--#exec cmd="/scripts/scripts.cgi"-->
と入れると何も出力されません。
AN HTTPDではフォルダの中に同じcgiを入れておくしかないのでしょうか?
それとも何か設定がいるのでしょうか?
ANHTTPDではCGIでソケット関数を使うものも動作しておりません。
BlackJumboDogでは何事もなかったのように動作します。。。
しかし、BJDではFOMAから見たときにContent-Lengthの問題(?)でエラーになるので
AN HTTPDだとエラーが出ないのでこちらを使いたいのですが…
いろいろと調べたのですが解決法がわかりませんでした。