アプリ版:「スタンプのみでお礼する」機能のリリースについて

/*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を実行するとき引数は付けられないのでしょうか?実は,練習用にカウンタを自作したのですが,その書式を引数で渡そうと考えて行き詰まりました。別の方法でもいいので,ブラウザ訪問者のアクション(クリックなど)なしで,引数を渡せないものでしょうか。

A 回答 (3件)

サーバーの種類が書かれていないので、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を禁止しています。

サーバーの種類や設定にも関係しますので、
それらも書いた方がより的確な答えが得られると思います。

この回答への補足

SSLでなくて,SSIでした。

補足日時:2006/09/22 02:05
    • good
    • 0
この回答へのお礼

レス,ありがとうございます。自宅サーバ,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"-->

勉強になりました。ありがとうございました。

お礼日時:2006/09/22 02:02

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"-->
となっているとエラーになります。
    • good
    • 0
この回答へのお礼

アドバイス,ありがとうございます。早速試しました。
<!--#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版だからなのかも。

お礼日時:2006/09/23 23:39

CGIの場合、引数(パラメータ)は


QUERY_STRINGという環境変数で
渡されます。

CGI、QUERY_STRING、URLエンコード

などをキーにして調べてみると
良いのではないでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/21 23:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!