人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

CGIを作成し、昨日からサーバ上でテストをしています。
ブラウザ上に何かを書き出すような物ではなく、約1時間に1度実行し、指定ディレクトリを読み、ファイルの名前と更新日などを別ファイルに出力するという物です。
無事に動いているように見えるのですが(必要なデータも取れるので)error.logを見ると「Premature end of script headers:〜」というエラーが必ず出力されます。
どういうものが理由として考えられますか?

●質問者: vicden
●カテゴリ:ウェブ制作
✍キーワード:CGI SCRIPT エラー サーバ テスト
○ 状態 :終了
└ 回答数 : 7/7件

▽最新の回答へ

1 ● hykw
●15ポイント

Windowsで作成して、Unix(Linux とか)に改行コード

そのままで送信したりしていませんか?(Samba でコピーとか FTP のバイナリーモードでとか)。

Unix で CR+LF の改行コードのスクリプトを食わせると、

件のエラーが出るかと思います。

◎質問者からの返答

Windowsで作ってますが、NextFTPでアップするときに改行コードは自動変更していますので、これではないような気がします。(試しに手動で改行コードを変えてみましたが、それでも同じくエラーが出ます。)


2 ● aki73ix
●20ポイント

http://sagittarius.dip.jp/~toshi/

交差点の真ん中で

こちらのページの Linux Tipsに Premature end of script headers の解決方法というのがあります

Perlに与える改行コードの問題が指摘されていますね

/usr/bin/perlの直後にCRLFがないですか?

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5408&for...

perl -cw での文法チェックもしてみましたか?

◎質問者からの返答

perl -cwでチェックすると

「Backslash found where operator expected at - line 2, near ”〜”」というのが出ます。

「〜」の中身は多分cgiの方ではなく、ディレクトリの中身が表示されているようなのですが…。


3 ● reply
●15ポイント

http://sagittarius.dip.jp/~toshi/premature.html

Premature end of script headers

Premature end of script headersの解決法-超簡易版

まず、もっとも簡単なCGIを動かしてみてください(パーミッション変更忘れずに)

#! /usr/bin/perl

#↑これは各自の環境に合わせてください

print ”Content-type:text/html¥n¥n”;

print ”test”;

これで動かなかったら以下の項目を試してみてください(責任はもてません)

A.あなたがサーバ管理者の場合(B.の借りてる場合も参照)

1、改行コードが誤認識される

なんか、こういう事態が発生することがあるみたいです。(うちもそうです)

perl script内の一行目に

#! /usr/bin/perl --

を付けるとなぜか直る。

※FTP転送で相手のOS自動認識がうまくいかないとなるとの報告もありますが、うちではなぜかLinux上で作成した物でもこれをつけないと動かないです^^

2、perlのパス表記が間違ってる。

てきとーにシンボリックリンクでも張って記述が違っても動くようにしてあげましょう。

3、その他

安定稼動しているApache1.3系に乗り換えましょう(私もそうしました。1の解決法も併用)

B.あなたがサーバを借りている場合

1、ファイル転送モードが間違っている

Binaryモードで転送すると動かないのでASCIIモードで転送してください。

2、文字コード変換がうまくいってない

通常FTPソフトは文字コードを自動変換してくれるらしいのですが、うまく言ってない場合もあるとかないとか。

サーバがLinux系の場合はEUCとかにしてあげるとよいみたいです。

3、改行コードが誤認識される

2の問題と関連するみたいですが、なんか、こういう事態が発生することがあるみたいです。(うちもそうです)

perl script内の一行目に

#! /usr/bin/perl --

を付けるとなぜか直る。

4、perlのパス表記が間違ってる

パスを再確認しましょう。SSHなどでログインできる場合は

%which perl

などでパスを確認できるかも。わかんなかったら管理者に聞きましょう。

5、その他(おまじないレベル?) print ”Content-type:text/html¥n¥n”

とかの部分の「¥n」をたくさん増やしてみる。

直ったとの報告あり

私の知ってるのはこんな程度です。ちなみに私のはApache2.0系ので全然動かず(mod_perlがおかしかったので直してもhtmlがみれなかったりとか)1.3系に入れなおして1の解決法で直しました。

ちなみに、Premature end of script headersは何か特定の問題を示すに至るエラーではないようです。何かしらの問題で、ちゃんと結果が出力されないときに出るという感じみたいです。

http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&c2coff=1&...

◎質問者からの返答

転送モード、文字コード、#!/usr/local/bin/perl -、

全部やってみましたがダメみたいです。

(content-type〜はこのcgi中には使用していません。)

データが出力されていないのならまだいいんですけど、

出力されてなおかつエラーが出るので困っています。(この調子なら1日に24回はエラーを吐くので…。)


4 ● ycyc
●10ポイント

http://mm.apache.or.jp/pipermail/newbie/2001-November/001526.htm...

”CGIからhttpdに返されたヘッダーが正常に終了していない”という意味ですので、「ブラウザ上に何かを書き出すような物ではなく...」といのが原因ではないでしょうか?

「1時間に1度実行し...」ということは、cgiがヘッダを返さずにずっとsleepしているということですか?

◎質問者からの返答

前回の処理日時を記録するファイルを作っており、それを読み出して、異なっていたら処理をするというものです。htmlにSSIを貼っていて(SSIは動くようにしています)例えば、前回の処理日時が「2004/04/23 09」として記録されていたなら、これと同じ時間にページが読み込まれた場合はデータ取得の処理をせず、10時台になったら処理をし、日時登録のファイルを書き換えます。

(ですので、「約1時間に1度実行」です。)

エラーは、データの書き換えが起こったときにのみ出力され、データの書き換えが起こらないときには出力されません。


5 ● aki73ix
●10ポイント

http://japache.infoscience.co.jp/japache/docs/misc/FAQ.html#prem...

Apache Server Frequently Asked Questions

14. ”早すぎるスクリプトヘッダのエンド” で CGI が失敗することは、何を意味していますか?”?

を見てください

http://www11.plala.or.jp/stoyama/sr1linux/rhfaq.html#A13

FAQ for Redhat Linux

1.cgiスクリプトの改行コードが正しくない.

サーバー上で cat -v ファイル名 として,行末に ^M がついている場合がこのケースです.

DOSの改行コードで作成されたcgiファイルをftpで転送する場合,RedHat-8以降で標準の vsftpd の初期設定の問題から,ASCIIモードで転送したつもりでも,binary モードで転送されてしまいます.

/etc/vsftpd/vsftpd.conf の以下の箇所をアンコメントすれば,ASCII転送ができるようになります.

#ascii_upload_enable=YES

#ascii_download_enable=YES

2.ユーザーディレクトリの ~/public_html/ より下の階層でcgiを動かそうとしている.

suexec が原因です./usr/sbin/suexec を削除するか,リネームすれば解消します.

◎質問者からの返答

suexecがあやしそうな気がします。レンタルサーバの身でsuexecをどうこうできるのか解らないので、とりあえず調べてみるとして、次の方の回答を見させてください。


1-5件表示/7件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ