• ベストアンサー

apache でバイナリのCGIを動かすには

apache でバイナリのCGIを動かすにはどうすればよいのでしょうか? (なお、プログラム自体に問題は決してありません。『HTTPD』を使うと問題なく動作します) OS:WIN98 C++バイナリのCGIを呼び出すと下記エラーとなります。 Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please .... the error. More ... log. - Apache/1.3.12 Server at http://127.0.0.2/ Port 80 最終アクセスログ 127.0.0.1 - - [12/Mar/2001:23:20:27 +0900] "GET /ab.cgi HTTP/1.1" 500 610 最終エラーログ [Mon Mar 12 23:20:25 2001] [error] [client 127.0.0.1] Premature end of script headers: e:/www.homepage/kokucho81/ab.cgi apache の httpd.conf と httpd.conf.default との比較 ** httpd.conf ServerName http://127.0.0.2/ ** httpd.conf.default #ServerName new.host.name ** httpd.conf DocumentRoot "E:/WWW.HOMEPAGE/KOKUCHO81" ** httpd.conf.default DocumentRoot "C:/Apache/htdocs" ** httpd.conf <Directory /> Options FollowSymLinks ExecCGI AllowOverride None ** httpd.conf.default <Directory /> Options FollowSymLinks AllowOverride None ** httpd.conf <Directory "E:/WWW.HOMEPAGE/KOKUCHO81"> ** httpd.conf.default <Directory "C:/Apache/htdocs"> ** httpd.conf Options Indexes FollowSymLinks ExecCGI ** httpd.conf.default Options Indexes FollowSymLinks MultiViews ** httpd.conf AddHandler cgi-script .cgi ** httpd.conf.default #AddHandler cgi-script .cgi そもそも、設定が足りてないんでしょうか? apacheを良く使う方、よろしくお願いします。m(_ _)m

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

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

見たところおかしいところはなさそうなのですが。 Apache1.3.12をWin98上で使っていますが、同じようなことをしてもまるで問題なく動作しています。 試しに同じことをやってみましたが問題ありませんでした。コンパイラはVC6を使用しました。 参考にならなくてスミマセン。

kokucho81
質問者

お礼

ああ~、それでわかりました!!!! Apacheの設定も間違っていないし、プログラムも間違ってはいなかったのです!!! 私が使用しているのは1994年型の Borland C++ 4.02j です。 (VC++6.0 Enterpriseも持ってはいるのですが・・・BC++がお気に入りで・・・) BC++は同じプログラムソースに対して、 DOS16スタンダード DOS16オーバレイ WIN32コンソール WIN32グイ とできるのですが、普段からCGIプログラムではDOS16スタンダートを使用していました。これが原因だったみたいです。 『Nakata氏の An HTTP D』はかなりWindowsに対して高い柔軟性があるみたいで16bitプログラムでも問題なくCGIとして動くのですが、Apache(1.3.12)はどうやら動かないようです。WIN32コンソールとしてコンパイル・リンクすると、あっけなく動きました。 以前Apacheを使用していたときには、C++系のプログラムCGIがApacheでも動いていたのでおかしいな~と思っていたのですが、そのときには『Cygwin』でのG++で普通にコンパイルしていたので、自動的にWin32コンソールとなっていたのでApacheでも問題なく動いていたのでしょう。

その他の回答 (2)

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.2

cout使ってらっしゃるようですが、確かcoutってプログラム終了時にバッファのフラッシュアウトって保証してましたっけ? coutの最後に << endl;としても駄目でしょうか?

kokucho81
質問者

お礼

ううっ(涙) お世話になりました。 今回は以外な盲点でした。 でも、いろいろapacheの.confを調べる機会になりましたので、 ちょっとapacheの勉強になりました。 ありがとうございました。

kokucho81
質問者

補足

<< endl;としても駄目でしょうか? ダメです。 >cout使ってらっしゃるようですが、確かcoutってプログラム終了時にバッファのフラッシュアウトって保証してましたっけ? おっしゃるように、該当ステップで吐き出されるとは限りませんが、プログラム終了時にはちゃんと吐き出されると思いますが。 (それにもちろん、printf分を使ってもダメです) レンタルサーバー上の『apache』や『An HTTPD』で動く限り、プログラムソースの問題という可能性はないとおもいます。 エラーが出る前の不思議な現象として、かならず、フロッピーディスクドライブを読みにいって何かを探そうとしていますね。

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

HTTPDっていうのがどのHTTP Daemonの事を挿すのかわかりませんが・・・(apacheもソースからmakeするとhttpdで出来上がるし・・・) そのab.cgiを通常のプログラムとして実行してみた場合、HTTP header(ContentType: text/htmlとか色々)は吐かれていますか? また、吐かれたheaderとデータ本体の間は<CR><LF>(キャリッジリターン、ラインフィード、確か0x0dと0x0aだったと思います)で区切られてますか? error logの出力からはそのように読めるので、一応確かめてみてください

kokucho81
質問者

補足

ちゃんと正しく書きたかったのですが、ここの投稿は字数が800字以上書けないらしくって、あっちこっち省いているうちに、わかりにくい文章になってしまいました。 HTTPD っていうのは『nakata氏のAn HTTP』サーバーです。 >そのab.cgiを通常のプログラムとして実行してみた場合、HTTP header(ContentType: text/htmlとか色々)は吐かれていますか? また、吐かれたheaderとデータ本体の間は<CR><LF>(キャリッジリターン、ラインフィード、確か0x0dと0x0aだったと思います)で区切られてますか? CGI自体に問題はないとおもいます。一応以下にソースを掲載しますが… 以下ソース #include <iostream.h> int main(){ cout << "Content-type: text/html\n\n"; cout << "<html><body>\n" << "Hello World" << "</body></html>\n"; return 0; } 実際にコンパイル済みものをローカルで上記のAn HTTPDサーバーでCGIとして呼び出しても問題なく動きますし、ソース自体をレンタルサーバー(Apache+FreeBSD)のTELNETでGCCコンパイルしたものも問題なく動きます。 ローカルのapacheの設定が、間違っているのだと思います。 PERL系CGIはすぐ動くようになるのに… どう間違っているのでしょうか?

関連するQ&A