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

以前、こちらのサイトで『httpd の1.42pで表示出来ないCGIがあるのですが・・・ 』と質問させていただいたものです。
その時の同じcgiプログラムなのですが、現在もhttpd上では表示できません。サーバー上では問題なく動いています。

今年8月にレンタルサーバーを移行する事になり、念の為、cgiに不具合がないか調べている所です。
しかし、じっくり見直してみたのですが、どうしてもどこがいけないのか見つけ出せません。
そこで、インターネットで調べた所『Perl言語のオンライン文法チェッカー』(http://www.e777.co.jp/perlcw/
というサイトを見つけました。
このサイトでチェックしてみた所、tmp.pl syntax OK と表示されました。
サイト上の説明では、『「tmp.pl syntax OK」と表示された場合は文法的な問題は全くありません。』
と書かれています。
この表示を信頼してもでしょうか?
文法に問題がなければ、サーバー上で暴走する事はないと考えてよいのでしょうか?

また、httpd上では表示できないのに、サーバー上では問題なく動く、またPerl言語のオンライン文法チェッカーでも、tmp.pl syntax OK と表示されるというのは、何に問題があると考えたらよいのでしょうか?

皆さん、アドバイス、ご指導のほどよろしくお願い致します。

A 回答 (4件)

では2件ともログに記録するやりかたを書きます


>c:\hoge>perl hoge.cgi
これを >記録するfile名 をつけて(名前は適当に)
c:\hoge>perl hoge.cgi>PERL-TEST-01.txt

telnetの方は途中でlogfile c:\hoge\telnet-test-01.txt を追加します
 (#2と重複しますが 通し で書きます)
c:\hoge>telnet <=と打って[Enter]を押します
TELNET> set logfile c:\hoge\telnet-test-01.txt <=と打ってENTER
TELNET> set localecho <=と打ってENTER
TELNET> set crlf <=同上
TELNET> open localhost 80 <=同上
localhostと接続中.... と表示されたら
HEAD /~tarou/test/test.cgi HTTP/1.0 <=と打ってENTER2回押す(入力した文字が一番上に重なって見えるので見難いですが このとおりに入力してください)

PERL-TEST-01.txt を開いてみたとき
Content-type: text/html
<=ここに空行が有ればOK 
<html>以下HTML文省略
 (ヘッダの終わりを示す空行の上はContent-typeだけでなくSet-Cookieヘッダも付く場合や Locationヘッダになる場合も有ります)

c:\hoge\telnet-test-01.txtの中を開くと
HEAD /~tarou/test/test.cgi HTTP/1.0 こそ(末尾の "こそ”は「ウェルカムメッセージ と重なって入力するため、その末尾の "こそ" が残っています)
HTTP/1.1 200 OK <=正常ならこうなります
Date: Fri, 30 May 2008 12:28:21 GMT
Server: Apache/2.2.8 (Win32)
Connection: close
Content-Type: text/html
<=fileの末尾がここの空行に成るはずです

**ログを取りながらTESTする説明は以上

>タグの最後にあたる、</HTML>が表示されれば良いのでしょうか?
意図したHTML文が表示される=プログラムが動いてる ですが
=CGIとして正常 とはなりません

webサーバーが認識できる形式のヘッダ
<=空行
が表示されることが重要です

実は500 Internal Server Errorが出ると言うのはプログラムが動いたか
動かなかったかとは直接関係有りません
CGIを実行しようとして httpdに返ってきた文字列が
webサーバーが認識できる形式のヘッダ+空行 で始まっていないと500エラーになります

ですから掲示板CGIなどで投稿文の書き込みに成功してもヘッダがおかしければ500エラーになります

Perlの構文エラーの時に500エラーとなるのはプログラムがうまく動かなかったからが直接の原因ではなく
Perlがエラーメッセージを吐き、それがヘッダとして認識できないからです

>localhostと接続中.... のあとに入力する文字のタイピングミスかな?
私にはそうとしか思えません
ステータスコード501 は リクエストヘッダがおかしいとそうなります
HEAD または GET か POST ならいいのですが DEAD なんて送ると501です
「HTTP Status Code」<=このページ詳しいです
http://www.studyinghttp.net/status_code

この回答への補足

umasikajiroさん、何度もありがとうございます。
一般的なデバッグ方法で、cgiを実行した場合も
Content-type: text/html
<空行>
が表示されていませんでした。(^^ゞ

プログラムの最後にHTMLを書き出すようにしているのですが、
書き出しを下記のようにしました。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang="ja">

<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">

この為、<META>タグ内に書いてあるため、いらないと思い消してしまっていたようです。
初歩の初歩でお恥ずかしいです。(^^ゞ
ネットで調べても、『Content-type: text/html』がないとエラーになると書かれていますね。
それにしても、なぜサーバー上では動いていたのかわかりません。
<META>タグ内に書いてあった為でしょうか?
とっても不思議です。
どうもありがとうございました。
P.S. 長くなったため、補足欄に書かせて頂きました。<m(__)m>

補足日時:2008/05/31 13:21
    • good
    • 0

>それにしても、なぜサーバー上では動いていたのかわかりません。


あ~ そういえば、すっかり忘れてましたけど思い当たる節が
ひょっとしてヒアドキュメントで

print<<HTML;

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang="ja">以下略
みたいに書いていませんでした?
これだとprint<<HTML; の下が一行空いてますので 空行を出力しています
(もしくはスクリプトの上のほうに print"\n"; とだけ書いても空行 )

Content-type: text/htmlがないので宜しくない状態ですが
空行だけ出力すると ヘッダが終わり と言う事だけはApacheは理解するので
確か DefaultType text/plain(設定によるがほとんどのサーバーはこのまま)
で出力したはずです。
で、MSIEの場合はtext/plainヘッダを貰っても 文中にHTMLタグが有るとHTMLとして表示します
(FireFoxなどMozilla系はプレーンテキストとして表示)
今、LinuxのとXPのApacheで試してみましたがやはりそうなりました。

そのあたりAnhttpdは違うのかも知れません
    • good
    • 0
この回答へのお礼

umasikajiroさん、確認までしていただいたようで、申し訳ございません。<m(__)m>

ご指摘どおり、ヒアドキュメントを使って書いています。
Perl/CGI辞典のサンプルプログラムを改良して作っているので、
print <<"EOM";
と書いていますが。

原因もわかり、すっきりしました。
何度も丁寧なご説明、どうもありがとうございました。<m(__)m>

お礼日時:2008/05/31 19:37

Warning: CGI TerminateProcess で検索してみましたが


http://www.st.rim.or.jp/~nakata/gbook/gbook.78.htm
anhttpd作者の方が「直接は関係ないだろうと思います。 」と書かれています
また
http://homepage1.nifty.com/yito/namazu/gbook/200 …
では「Warning は Error ではないので、何かおかしい現象が出ない限りは、気にしなくてよいと思います。」
ので
原因がやはり不明ですね

勘で答えると CGIが Content-type: text/html\n\n などを吐く前に
anhttpdの子プロセスがWarning を吐くのだとしたら
処理できなくてエラーになるかもしれませんが、、、

一般的なデバッグ方法を書いてみます
*まず#1に書いた
c:\hoge>perl -wc hoge.cgi
でsyntax ok が出たら次は -wc無しで
c:\hoge>perl hoge.cgi
これで実行されますので
Content-type: text/html
<=空行
などとヘッダが正常に出力されれば まずはOKです。

*次に telnetで anhttpd上のCGIにアクセスします
CGIのURLが http://localhost/~tarou/test/test.cgi だと仮定して

コマンドプロンプトから(以下にある 80 とは 80port(http接続)です)
c:\hoge>telnet <=と打って[Enter]を押します
TELNET> set localecho <=と打ってENTER
TELNET> set crlf <=同上
TELNET> open localhost 80 <=同上
localhostと接続中.... と表示されたら
HEAD /~tarou/test/test.cgi HTTP/1.0 <=と打ってENTER2回押す(入力した文字が一番上に重なって見えるので見難いですが このとおりに入力してください)

HTTP/1.1 200 OK  <=ステータスコード200が帰ってきたらOKです

この回答への補足

umasikajiroさん、遅くなりましたが、再びアドバイスどうもありがとうございました。
申し訳ありませんが、再度質問させてください。

1.一般的なデバッグ方法で、cgiを実行した場合の表示について教えて下さい。

  > Content-type: text/html
  > <=空行
  > などとヘッダが正常に出力されれば・・・
とのことですが、
htmlを書き出すプログラムの場合(カレンダー表示のcgiなのですが)、タグの最後にあたる、</HTML>
が表示されれば良いのでしょうか?
長いためか、はじめの方のヘッダは表示されません。(スクロールバーを上まで上げても)
ただ、この方法で実行した場合、必ずタグの最後</HTML>は表示されます。

2.telnetで anhttpd上のCGIにアクセスした際の出力結果について教えて下さい。
1.の表示でOKと思っているため、telnetで anhttpd上のCGIにアクセスしてみました。
何度も試してみたのですが、HTTP/1.1 200 Document follows
とOKの表示が出ることもあるのですが、
HTTP/1.1 501 Not Implemented
もしくは
HTTP/1.1 404 File Not Found
が出ることが多いのです。
404の時には、can't find cgi script or executable
と表示されたり、
file doesn't exist or is read protected
と表示されます。
なぜ、成功するのか、失敗するのか疑問です。
localhostと接続中.... のあとに入力する文字のタイピングミスかな?
と思うのですが、それ以外に何か考えられる事はありますか?

この2点について、お時間のある時に教えて下さい。
よろしくお願い致します。

補足日時:2008/05/30 10:45
    • good
    • 0

>サーバー上で暴走する事はないと考えてよいのでしょうか?


いいえ文法上で間違いが無いのと暴走することは違います。

下記は間違いなく暴走するスクリプトですが
#! /usr/bin/perl
print"Content-type: text/html\n\n";
print"<html>\n";
print "<head>";
print "</head>";
$a=0;
while($a<1)
{print "abc\n";}
__END__
これで件のページにてチェックすると syntax OK
 (と言うか文法的に問題があれば起動しませんので当然暴走もしません)
 (逆に言えば 暴走するスクリプトは起動できないような文法ミスは無いってことになります)
さらにprint"Content-type: text/html\n\n"; を消してみたり
存在しないライブラリをrequireしても syntax OK
おそらく perl -wc でチェックしているものと思われますが

>httpd の1.42p
とありますのでwindows上でAnhttpdをお使いと思いますけど
コマンドプロンプトを起動して CDコマンドで スクリプトの場所に移動してから
使い方が判らなければ=> http://cmd-pro.com/sta_end.html
c:\hoge>perl -wc hoge.cgi
としても同じチェックが出来ます
http://www.apec.aichi-c.ed.jp/project/joho/kanri …[2]3d

>httpd上では表示できないのに、サーバー上では問題なく動く、
Anhttpdでは駄目だがプロバイダのサーバーでは動くと言う意味かな?
さあ? そもそも同じ環境では無いのでそういうこともありえるでしょうね
一つの例としては Unix系サーバーでは一般的にインストールされているモジュールやライブラリが
ActivePerlには含まれて居なければ そうなりますが

AnHttpd使ったこと無いので判りませんが エラーログって有りませんか?

この回答への補足

umasikajiroさん、アドバイスありがとうございます。
暴走しないかどうかと文法チェックは別物なんですね。
何かこの『ページを表示できません。』と表示されるエラーの原因をつきとめる方法はないですかね。
作り直すしかないのかな・・・。

ちなみに、エラーログの記録ですが、下記のように残ります。
Sun May 25 17:15:45 2008 Warning: CGI TerminateProcess 3156 error 5
このログから、何かわかりますか?
お時間のあるときでかまいません、またアドバイスよろしくお願い致します。<m(__)m>

補足日時:2008/05/25 17:17
    • good
    • 0

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