質問
- SSIの「#exec cmd=」の実行結果が表示されず、原因が分かりません
-
本文:
お分かりの方がおられましたら、ぜひご教示ください。
サブドメインの環境を構築しており、index.shtmlでSSIの結果を表示したいのですが何も表示されずに困っています。
(実行結果が無いのか、実行されていないのか分かりません)
ファイル構成と状況は以下の通りです。
◆ファイル構成 (サブドメイン環境です)
Home
└─ public_html
├─ .htaccess
└─ サブドメイン
├─ cgi
│ └─ g
│ └─ xxx.cgi
│
└ index.shtml
◆状況
サブドメイン/index.shtml にアクセスしています。
.htaccess には、以下の記述を追加しています。
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml
index.shtmlファイルに以下の記述をしています。
<!--#exec cmd="./cgi/g/xxx.cgi" -->
直接「Home/サブドメイン/cgi/g/xxx.cgi」にアクセスすると、
想定通りの文字列が表示されます。
そのため、コードとパーミッションは正しいと思っています。(705を設定)
よろしくお願いします。 - 緊急度:通常投稿者: さん投稿時間:2016/05/19 00:12
回答 No.4743
-
本文:
index.shtmlファイルに以下の記述をすると、想定の文字列が表示されました。
<!--#include virtual="/cgi/g/xxx.cgi"-->
または
<!--#include virtual="./cgi/g/xxx.cgi"-->
ただ、引数を渡すとエラーになったため、「#include virtual」では
達成できないのかな?という状態です。
引き続、よろしくお願いいたします。 - 投稿者: さん 投稿時間:2016/05/19 00:23
回答 No.4745
-
本文:
○ xxx.cgi が短いプログラムなら、全文引用してみる。
○ xxx.cgi が長いプログラムなら、たぶん、
cgiとして実行される場合と、cmd で実行される場合とで、環境が違う(pathの値とか、環境変数の値とか)辺りを疑ってみる。 - 投稿者:ジョバンニさん 投稿時間:2016/05/19 05:36
回答 No.4746
-
本文:
以下で動作してます。
-----
i.shtml
-----
<!--#config timefmt="%Y/%m/%d %X" -->
<!--#echo var="LAST_MODIFIED" -->
<!--#exec cgi="i.cgi" -->
<!--#exec cmd="i2.cgi" -->
------
i.cgi 705
------
#!/usr/local/bin/perl
print "Content-Type: text/html\n\n";
print "test\n";
------
i2.cgi 705
-------
#!/usr/local/bin/perl
print "hallo\n";
■
>(実行結果が無いのか、実行されていないのか分かりません)
CGIの中で、ファイル出力するとかで、実行したかどうかを調べてみては? - 投稿者:k-tanさん 投稿時間:2016/05/19 10:06
回答 No.4748
-
本文:
◆ジョバンニさん、ありがとうございます。
プログラムは「print」文だけに簡略化しています。
> 環境が違う(pathの値とか、環境変数の値とか)辺りを疑ってみる。
仰っている箇所に怪しさを感じます。(テスト結果を末尾につけます)
ただ、対処法が分からず。
◆k-tanさん、ありがとうございます。
記述頂いた簡単なプログラムでテストを実施しました。
その結果、次の2点が疑問となりました。(テスト結果を末尾につけます)
・パス付きのコマンドで実行結果が異なる
・引数付きの「#exec cmd」の実行結果が異なる
◆テスト結果
判定 i.shtmlの記述 出力結果
○ : <!--#exec cgi="i1.cgi" --> : test1 -> Home-サブドメイン
○ : <!--#exec cmd="i2.cgi" --> : TEST2 -> Home-サブドメイン
○ : <!--#exec cgi="/i1.cgi" --> : test1 -> Home-サブドメイン
○ : <!--#exec cmd="/i2.cgi" --> : TEST2 -> Home-サブドメイン
○ : <!--#exec cgi="cgi/g/i1.cgi" --> : test1 -> Home-サブドメイン-cgi-g
× : <!--#exec cmd="cgi/g/i2.cgi" --> : TEST2 -> Home-サブドメイン
○ : <!--#exec cgi="/cgi/g/i1.cgi" --> : test1 -> Home-サブドメイン-cgi-g
× : <!--#exec cmd="/cgi/g/i2.cgi" --> : TEST2 -> Home-サブドメイン
⇒ ×:出力結果が違うので、「"i2.cgi"」が実行されている。("/cgi/g/i2.cgi"ではない)
判定 i.shtmlの記述 出力結果
○ : 引数なし : <!--#exec cmd="i2.cgi" --> : TEST2 -> Home-サブドメイン
× : 引数あり : <!--#exec cmd="i2.cgi ip=1" --> : (空白)
⇒ ×:引数をつけると空白になる。実行できない?(cgiは他で成功しているものです)
◆以下の2つを実現できれば、解決できるように思います。
パスの先のcgiを実行したい。
引数付きのcgiを実行したい。(Apacheのバージョンによって、引数を渡せない情報を見つけました。)
よろしくお願いいたします。
- 投稿者: さん 投稿時間:2016/05/19 23:22
回答 No.4749
-
本文:
> パスの先のcgiを実行したい。
> 引数付きのcgiを実行したい。(Apacheのバージョンによって、引数を渡せない情報を見つけました。)
これだけが目的なら、
<!--#include virtual="./cgi/g/xxx.cgi?arg1=a&arg2=b" -->
で達成できると思いますよ。
#exec cmd= だと、パラメータは送れないみたいですね。
- 投稿者:ジョバンニさん 投稿時間:2016/05/20 01:54
回答 No.4752
-
本文:
◆ジョバンニさん、ありがとうございます。
これまで使っていたサーバとApacheのバージョンが異なることで、
使えるコマンドと制約が変わっていたことが分かりました。
◆k-tanさん、ありがとうございます。
記述頂いた簡単なプログラムでテストを実施できたので、
大変助かりました。
◆結果(わかったこと)
Apache 1.2.(?) 以降では、以下の記述を推奨していました。
<!--#include virtual="./cgi/xxx.cgi?arg1=a&arg2=b" -->
それ以前に使うことができた以下のコマンドは非推奨となっていて、
途中から引数を渡すことができない制約となっていました。
<!--#exec cgi="xxx.cgi" -->
<!--#exec cmd="xxx.cgi" -->
これで先に進むことができます。
ありがとうございました。
- 投稿者: さん 投稿時間:2016/05/20 22:23
回答 No.4751
この回答がベストアンサーです
実際にみた結果
・cgiというサブフォルダに置く
・GETで引数を受け渡す
----
/cgi/i05.cgi
----
#!/usr/local/bin/perl
print "Content-Type: text/html\n\n";
print "test05\n\n";
print $ENV{'QUERY_STRING'};
-----
i.shtml
-----
<!--#include virtual="./cgi/i05.cgi?arg1=a&arg2=b" -->
-----
実行結果
-----
test05 arg1=a&arg2=b