CGIを作成し、昨日からサーバ上でテストをしています。

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答7件)

id:hykw No.1

回答回数12ベストアンサー獲得回数0

ポイント15pt

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

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

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

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

id:vicden

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

2004/04/23 09:25:36
id:aki73ix No.2

回答回数5224ベストアンサー獲得回数27

ポイント20pt

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

交差点の真ん中で

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

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

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

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

id:vicden

perl -cwでチェックすると

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

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

2004/04/23 09:38:02
id:reply No.3

回答回数787ベストアンサー獲得回数0

ポイント15pt

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は何か特定の問題を示すに至るエラーではないようです。何かしらの問題で、ちゃんと結果が出力されないときに出るという感じみたいです。

id:vicden

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

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

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

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

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

2004/04/23 09:45:11
id:ycyc No.4

回答回数37ベストアンサー獲得回数6

ポイント10pt

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

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

id:vicden

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

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

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

2004/04/23 09:49:28
id:aki73ix No.5

回答回数5224ベストアンサー獲得回数27

ポイント10pt

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

を見てください

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 を削除するか,リネームすれば解消します.

id:vicden

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

2004/04/23 10:06:06
id:JULY No.6

回答回数966ベストアンサー獲得回数247

ポイント20pt

2つ目の回答に対してで「Backslash found where

operator expected at - line 2, near ”〜”」という

のが出ると書かれていますが、もしかして、ディレクト

リ・ファイルの区切り文字か何かに「¥」を使っていませ

んか?

「Premature end of script headers」の直接的な原因

は、上記メッセージ(Backslash〜)が CGI の結果とし

て送られてしまっているためだと思われます。

id:vicden

¥は使ってないんですよね。

ただ、書かれている「〜」の内容は、cgiの内容ではなく、読み込んでいるディレクトリの中にあるファイルの内容なんです。(そのファイルの中にあるということでしょうか?)

ちなみに、perl -cwを何度も繰り返すと、

lineに書かれている行数が1つずつ増えます。(最初は1、次は2)

2004/04/23 12:07:01
id:JULY No.7

回答回数966ベストアンサー獲得回数247

ポイント20pt

「Backslash 〜」の後ろについてくる内容がファイルの

内容となると、CGI プログラムがそのファイルの中身を

スクリプトとして解釈しようとしているように思われま

す。

こうなると、実際にコードを見て見ないとなんとも言え

ませんが、perl -d などでデバッグしてみるしかないと

思います。

id:vicden

デバッグで無事解決しました。ありがとうございました。

2004/04/23 14:04:32
  • id:andymente
    「content-type〜はこのcgi中には使用していません」とありましたが

    たとえブラウザに何も書き出すことがなくても、
    ブラウザから呼び出す(CGI として動かす)以上、
    Content-type は出力すべきです。
    おまじないだと思って、
    print "Content-type:text/html¥n¥n";
    のようにスクリプトの初めのほうに書いておけばよいと思います。
    http://www.studyinghttp.net/rfc_ja/2616/sec7.html#sec7.2.1

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません