>>いとさん
ありがとうございます。
おっしゃるとおりCGIから外部のファイルを取り込むパスが相対パスになっていました。
これをローカルパスに記述しなおしたところ全てのページで問題なく表示されるようになりました。
本当にありがとうございます。
(み) さん
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";
>>中田さん
ドキュメントルートは 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"--> ○
という結果でした。
(み)さん、
ドキュメントルート、script.pl、index.shtml のローカルパスはそれぞれ何ですか?
>>中田さん
相対パスとローカルパスで指定して
いくつかのスクリプトを移動して試しましたが
<!--#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です。
他に何の原因が考えられますでしょうか。
(み)さん、
ドキュメントルートをルートとする仮想パスは、#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"
でいいわけです。
>>中田さん
レスありがとうございます。
SSIで呼び出すスクリプトなのですが、ソケットを使う携帯端末向けの16文字ローテーション広告挿入スクリプトです。
これの設置方法に#exec cmdでの呼び出しを指定されているのです。
要はドキュメントルートから見たパスでスクリプトを呼び出したいのですが
rootこのような状態だと仮定して、
- script.pl
- dir1
-index.shtml
(み)さん、
#exec する中身が空行を出力する普通の CGI なのであれば、
#exec cmd=... ではなく、#exec cgi=... を使ってください。
ソケット関数云々の方は、「動作しない」というではわかりませんので、どういうエラーになるのかをお知らせください。エラー500なら、「CGI出力を検査」にチェックを入れて、表示されるエラーメッセージから原因を判断してください。よくわからない場合は、そのエラーメッセージの内容をお知らせください。
An HTTPDでSSIをドキュメントルートからの絶対パスで指定すると動作しません。
バージョンは1.42mです。
カレントでは実行できるのですが <!--#exec cmd="/scripts/scripts.cgi"-->
と入れると何も出力されません。
AN HTTPDではフォルダの中に同じcgiを入れておくしかないのでしょうか?
それとも何か設定がいるのでしょうか?
ANHTTPDではCGIでソケット関数を使うものも動作しておりません。
BlackJumboDogでは何事もなかったのように動作します。。。
しかし、BJDではFOMAから見たときにContent-Lengthの問題(?)でエラーになるので
AN HTTPDだとエラーが出ないのでこちらを使いたいのですが…
いろいろと調べたのですが解決法がわかりませんでした。