プロが教えるわが家の防犯対策術!

ローカルのマシンにApacheを設定後,
テストのために簡単な javascript を含んだhtmlファイルをfirefoxから読み込もうとしたところ "Premature end of script headers" が出ました.
自身で調査しましたが,どうしても解決できません.
非常に困っております.どなたかご教授頂ければ幸いです.

【環境】
[OS]   Ubuntu 10.04 LTS
[Apache] Version 2.2.14 (Ubuntu)

[Apacheの設定]
初期設定でapache2.conf から (1) httpd.conf, (2) sites-available/default等が include されます.
(2)のファイルのみ以下を変更しました:
DocumentRoot /home/hoge/www/
ScriptAlias /cgi-bin/ /home/hoge/www/cgi-bin/
<Directory "/home/hoge/www/cgi-bin/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

また mime.types には次の記述があります.
application/javascriptjs
text/x-perl    pl

【テストファイルの内容】
index.html 644
************************************************************
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<title>Test Example</title>
<script type="text/javascript" src="/cgi-bin/test.js"></script>
<script type="text/x-perl" src="/cgi-bin/first.pl"></script>
</head>
<body>
TEST
</body>
</html>
************************************************************

/home/hoge/www/cgi-bin/first.pl 755
***************************************
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";
***************************************

/home/hoge/www/cgi-bin/test.js 755
***************************************
document.write("Content-type: text/html<br><br>");
document.write("Hello World!");
***************************************

【エラーの再現手順】
Firefox 3.6.13 から
(1) http://localhost/test.html とした場合 TESTを出力しログにエラー
[error] [client 127.0.0.1] Premature end of script headers: test.js, referer: http://localhost/test.html
(2) http://localhost/cgi-bin/first.pl (出力正常)
(3) http://localhost/cgi-bin/test.js (Internal Server Error)
perl は大丈夫なのですが js がエラーになります.

A 回答 (2件)

<Directory "/home/hoge/www/cgi-bin">


SetHandler cgi-script
</Directory>

どこかにこの項目がありませんか?


特定ディレクトリ(この場合は/home/hoge/www/cgi-bin)内の「全てのファイル」を
CGIスクリプトと見なして実行する設定です。

そのディレクトリ内のtest.jsもCGIスクリプトと見なして実行しようとしますが、
#!/usr/bin/perlなどの記述もなく、実行形式のファイルではありませんから、Internal ServerErrorになります。


SetHandlerをコメントアウトするか、削除する、(別途、拡張子.plや.cgiファイルをCGIスクリプトとして実行させる設定が必要です。)
または、
test.jsファイルをcgi-binディレクトリ以外の場所に入れて、HTMLのsrc属性もそれにあわせて変更してみて下さい。


追伸。

JavaScriptの文法や、PerlとJavaScriptの連携はまた別問題ですので、JavaScriptはJavaScriptとして勉強して下さい。
text/x-perlというtypeもありません。

この回答への補足

> 特定ディレクトリ(この場合は/home/hoge/www/cgi-bin)内の「全てのファイル」を
> CGIスクリプトと見なして実行する設定です。
>
> そのディレクトリ内のtest.jsもCGIスクリプトと見なして実行しようとしますが、
> #!/usr/bin/perlなどの記述もなく、実行形式のファイルではありませんから、Internal
> ServerErrorになります。

ご指摘ありがとうございます.
おっしゃる通り私は js ファイルを実行しようとしておりました.
ここに大きな勘違いがあったように思います.

apache 設定ファイルの中の mine.conf にて "AddHandler cgi-script .cgi .pl .js"
の記述がありましたのでこれを削除し,js を格納するディレクトリを新たに作成することによって,
正常に apache 経由で表示させることができました.

> JavaScriptの文法や、PerlとJavaScriptの連携はまた別問題ですので、JavaScriptは
> JavaScript として勉強して下さい。text/x-perlというtypeもありません。

アドバイスありがとうございます.
少しずつ勉強したいと思います.

ご回答ありがとうございました.

補足日時:2011/01/14 09:23
    • good
    • 0

一般的なWebサーバーの構成で考えると、ご提示のindex.htmlをFirefoxがレンダリングした後のHTMLは、


<html>
<head>
<title>Test Example</title>
<script type="text/javascript">
Hello, World.
</script>
<script type="text/x-perl">
document.write("Content-type: text/html<br><br>");
document.write("Hello World!");
</script>
</head>
<body>
TEST
</body>
</html>
みたいなイメージになって、head部にdocument.writeしても表示に関係ないし、
firefoxで<script type="text/x-perl">のscriptが動くという話も私は、知らないし
結局表示は
TEST
のみだと思います。

Webサーバー側でjavascriptを実行させる仕組み準備してるんですか!
それにしてもサーバー側でdocument.writeは無いと思いますよ。
(サーバー側でdocumentは何をさすのやら非常に疑問です)

first.pl の方はちゃんとWebサーバー側で動作してますね。ブラウザーからの
<script type="text/x-perl" src="/cgi-bin/first.pl"></script>のGET送信
に対して、/cgi-bin/first.plが実行され、テキストの Hello, World. がレス
ポンスされ、ブラウザー側がその<script>要素のソースとして解釈すると思います。
ただ、firefoxで<script type="text/x-perl">でperlのスクリプトが動くとしても
ソースが Hello, World. じゃ無意味なような....

test.js の方はcgi-bin/の中にあるんで、Webサーバー側が無理やり実行しよう
として、サーバー側でエラーになって"Premature end of script headers" を
テキストとしてレスポンスし、javascriptがエラーを吐くっじゃないかと思います。

抜本的に何をされたいのか解らないので、あしからずの回答です。

この回答への補足

私の拙い質問にご丁寧に回答いただき誠にありがとうございます.
目的は以下URLにあるサンプルをローカルPC上でテストすることです.
http://cytoscapeweb.cytoscape.org/tutorial
これまで,
1.パスを適切に設定し,firefox からファイルを直接読みに行くとサンプルを正常に表示できることは確認しました.
2.しかしローカルPC上にApacheを設定・起動し,http://localhost/で読みにいくと js ファイルに対して premature のエラーが発生しました.
3.サーバの設定に問題があると考え,いろいろ試行錯誤するうちに簡単なソースのほうが設定の間違い探し・切り分けに適当かと考え先の質問のファイルを作成するにいたりました(perlはcgiの動作を確認するためにテストしました).ご指摘を受けtest.html,test.jsを以下のように修正してみました:
*** test.html ***
<html>
<head>
<title>Test Example</title>
<script type="text/javascript" src="/cgi-bin/test.js"></script>
</head>
<body>
<script type="test/javascript">
<!--
exf();
//-->
</script>
TEST
</body>
</html>

*** test.js (755) ***
function exf() {
var date=document.lastModified;
document.write(date);
}

ただ,このようにしても,
[error] [client 127.0.0.1] Premature end of script headers: test.js, referer: http://localhost/test.html
のエラーが発生し,表示がされません.


初心者のため,勘違い等々あるかと存じますが,
何かおかしいところがありましたら,ご教授いただければと存じます.

どうかよろしくお願いいたします.

補足日時:2011/01/13 20:01
    • good
    • 0

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