- ベストアンサー
Perl言語のオンライン文法チェッカーについて
- httpdの1.42pで表示できないCGIがあり、Perl言語のオンライン文法チェッカーを使用してチェックしましたが、文法に問題はなさそうです。
- httpd上では表示できないが、サーバー上では問題なく動くCGIプログラムについて、Perl言語のオンライン文法チェッカーでチェックした結果、文法に問題はないという結果が得られました。
- Perl言語のオンライン文法チェッカーによれば、CGIプログラムの文法には問題がないようですが、httpd上で表示できない原因については分からないとのことです。
- みんなの回答 (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
その他の回答 (3)
- umasikajiro
- ベストアンサー率67% (545/803)
>それにしても、なぜサーバー上では動いていたのかわかりません。 あ~ そういえば、すっかり忘れてましたけど思い当たる節が ひょっとしてヒアドキュメントで 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は違うのかも知れません
お礼
umasikajiroさん、確認までしていただいたようで、申し訳ございません。<m(__)m> ご指摘どおり、ヒアドキュメントを使って書いています。 Perl/CGI辞典のサンプルプログラムを改良して作っているので、 print <<"EOM"; と書いていますが。 原因もわかり、すっきりしました。 何度も丁寧なご説明、どうもありがとうございました。<m(__)m>
- umasikajiro
- ベストアンサー率67% (545/803)
Warning: CGI TerminateProcess で検索してみましたが http://www.st.rim.or.jp/~nakata/gbook/gbook.78.htm anhttpd作者の方が「直接は関係ないだろうと思います。 」と書かれています また http://homepage1.nifty.com/yito/namazu/gbook/20020727.1949.html では「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点について、お時間のある時に教えて下さい。 よろしくお願い致します。
- umasikajiro
- ベストアンサー率67% (545/803)
>サーバー上で暴走する事はないと考えてよいのでしょうか? いいえ文法上で間違いが無いのと暴走することは違います。 下記は間違いなく暴走するスクリプトですが #! /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/katuyou/CGIFrame.htm#aa[2]3d >httpd上では表示できないのに、サーバー上では問題なく動く、 Anhttpdでは駄目だがプロバイダのサーバーでは動くと言う意味かな? さあ? そもそも同じ環境では無いのでそういうこともありえるでしょうね 一つの例としては Unix系サーバーでは一般的にインストールされているモジュールやライブラリが ActivePerlには含まれて居なければ そうなりますが AnHttpd使ったこと無いので判りませんが エラーログって有りませんか?
補足
umasikajiroさん、アドバイスありがとうございます。 暴走しないかどうかと文法チェックは別物なんですね。 何かこの『ページを表示できません。』と表示されるエラーの原因をつきとめる方法はないですかね。 作り直すしかないのかな・・・。 ちなみに、エラーログの記録ですが、下記のように残ります。 Sun May 25 17:15:45 2008 Warning: CGI TerminateProcess 3156 error 5 このログから、何かわかりますか? お時間のあるときでかまいません、またアドバイスよろしくお願い致します。<m(__)m>
補足
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>