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

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

A 回答 (3件)

見たところおかしいところはなさそうなのですが。



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

ああ~、それでわかりました!!!!
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でも問題なく動いていたのでしょう。

お礼日時:2001/03/13 22:44

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


coutの最後に
<< endl;としても駄目でしょうか?

この回答への補足

<< endl;としても駄目でしょうか?
ダメです。

>cout使ってらっしゃるようですが、確かcoutってプログラム終了時にバッファのフラッシュアウトって保証してましたっけ?

おっしゃるように、該当ステップで吐き出されるとは限りませんが、プログラム終了時にはちゃんと吐き出されると思いますが。
(それにもちろん、printf分を使ってもダメです)

レンタルサーバー上の『apache』や『An HTTPD』で動く限り、プログラムソースの問題という可能性はないとおもいます。

エラーが出る前の不思議な現象として、かならず、フロッピーディスクドライブを読みにいって何かを探そうとしていますね。

補足日時:2001/03/13 17:20
    • good
    • 0
この回答へのお礼

ううっ(涙)
お世話になりました。
今回は以外な盲点でした。

でも、いろいろapacheの.confを調べる機会になりましたので、
ちょっとapacheの勉強になりました。

ありがとうございました。

お礼日時:2001/03/13 22:53

HTTPDっていうのがどのHTTP Daemonの事を挿すのかわかりませんが・・・(apacheもソースからmakeするとhttpdで出来上がるし・・・)



そのab.cgiを通常のプログラムとして実行してみた場合、HTTP header(ContentType: text/htmlとか色々)は吐かれていますか?
また、吐かれたheaderとデータ本体の間は<CR><LF>(キャリッジリターン、ラインフィード、確か0x0dと0x0aだったと思います)で区切られてますか?

error logの出力からはそのように読めるので、一応確かめてみてください

この回答への補足

ちゃんと正しく書きたかったのですが、ここの投稿は字数が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はすぐ動くようになるのに…
どう間違っているのでしょうか?

補足日時:2001/03/13 02:11
    • good
    • 0

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