• ベストアンサー

SSIで,CGIを実行するときに引数を渡したい

/*hello.exeのソース*/ #include <stdio.h> int main (int argc,char* argv[]) { int i; printf("Content-type: text/html\n\n"); printf("Hello"); for(i=1;i<argc;i++) printf(" %s",argv[i]); return 0; } 上記のC言語で書いた実行ファイルをCGIにしています。いろいろ勉強して経験値を積んでいるところです。このCGIについて,次のように引数を付けて読んでみると, <!--#exec cgi="/cgi-bin/hello.exe?ryo+kei+yoko"--> <!--#exec cgi="/cgi-bin/hello.exe ryo kei yoko"--> [an error occurred while processing this directive]というエラーになります。そもそも,SSIでCGIを実行するとき引数は付けられないのでしょうか?実は,練習用にカウンタを自作したのですが,その書式を引数で渡そうと考えて行き詰まりました。別の方法でもいいので,ブラウザ訪問者のアクション(クリックなど)なしで,引数を渡せないものでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

サーバーの種類が書かれていないので、Apacheで説明します。 cgiではなくvirtualを指定してみてください。 <!--#exec virtual="/cgi-bin/hello.exe?ryo+kei+yoko"--> 環境変数"QUERY_STRING"に入りますので、 #include <stdlib.h> getenv('QUERY_STRING') で受け取ることが出来ると思います。 > int main (int argc,char* argv[]) この書き方をするなら、 exec cmdで記述するとmain()の引数として受け取れます。 <!--#exec cmd="/cgi-bin/hello.exe ryo kei yoko"--> という記述になります。 (コマンドプロンプトから起動するときの引数と同じ記法です) Apache Foundationではcmdでの起動は推奨(virtualのほうが十分なテストを行われているため)されていませんし、 一部のホスティングサービスではcmdを禁止しています。 サーバーの種類や設定にも関係しますので、 それらも書いた方がより的確な答えが得られると思います。

southern_wind
質問者

お礼

レス,ありがとうございます。自宅サーバ,WindowsXpProでアパッチ2.2を動かしています。CGI,SSLを使用するためのconfファイルの設定は終えています。 試したのですが, <!--#exec cmd="/cgi-bin/hello.exe ryo kei yoko"--> <!--#exec virtual="/cgi-bin/hello.exe ryo kei yoko"--> はどちらも, [an error occurred while processing this directive] でした。ネット上で見つけた情報ですが, http://www.tohoho-web.com/lng/200003/00030004.htm にも,前者はだめなようなことが書かれています。アパッチのバージョンにもよるのでしょうか?後者はわかりません。 ただ,いただいたご回答は大きなヒントになりました。shtmlファイルで, <!--#set var="name1" value="ryo" --> <!--#exec cgi="/cgi-bin/hello.exe"--> のように明示的に環境変数として引数を渡して,Cで書いたCGIでは,getenv("name1"); として,引数へのポインタをゲットするようにしました。SSIが2行以上になってしまいますが,これはこれでみとおしがよいので,よしとしたいと思います。 先ほど,次のようにカウンターファイルの指定ができるようになりました。上手く動いています。 <!--#set var="counterfile" value="toppage.dat" --> <!--#exec cgi="/cgi-bin/counter.exe"--> 勉強になりました。ありがとうございました。

southern_wind
質問者

補足

SSLでなくて,SSIでした。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

virtualとcmdでは記法が違います。 <!--#exec virtual="/cgi-bin/hello.exe?ryo+kei+yoko" --> <!--#exec cmd="/cgi-bin/hello.exe ryo kei yoko" --> あと、すみません、-->の前のスペースが抜けていました。 Apache2.xでは-->の前にスペースを入れずに <!--#exec cmd="/cgi-bin/hello.exe ryo kei yoko"--> となっているとエラーになります。

southern_wind
質問者

お礼

アドバイス,ありがとうございます。早速試しました。 <!--#exec virtual="/cgi-bin/hello.exe?ryo+kei+yoko" --> <!--#exec cmd="/cgi-bin/hello.exe ryo kei yoko" --> コピーペーストして,半角スペースが入っていることを確認して試しましたが, [an error occurred while processing this directive] となりました。Windows上で動作しているApache2.2では引数はサポートされていないように見えますね。 なお, <!--#set var="counterfile" value="touring.dat"--> <!--#exec cgi="/cgi-bin/counter.exe"--> については,-->の前に半角スペースを入れなくてもエラーとならないです。Apacheの2.2ですが,Windows版だからなのかも。

すると、全ての回答が全文表示されます。
  • yasuch
  • ベストアンサー率41% (27/65)
回答No.1

CGIの場合、引数(パラメータ)は QUERY_STRINGという環境変数で 渡されます。 CGI、QUERY_STRING、URLエンコード などをキーにして調べてみると 良いのではないでしょうか。

southern_wind
質問者

お礼

レス,ありがとうございます。 早速調べてみました。URLにCGIと引数を指定して, 環境変数からCGIが受け取るということでしょうか。 htmlの中で,引数を記述して,CGIが受け取りたい のですが・・・。formを使うとユーザーがクリック などのアクションをしないと受け取れないので, なんとか自動でやりたいのですが・・・。

すると、全ての回答が全文表示されます。

関連するQ&A