こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PerlでHTTPヘッダの\nを外すとエラー

【PerlでHTTPヘッダの最後の\nを1つでも外すとエラーになります】

初歩的なことですみません。
HTTPヘッダーの最後の\n\nなんですが、ヘッダーの文字列の後に改行が2つ?? と思って
この\nを外して、
print "content-type:text/html;charset=utf-8"; とすると、「500 Internal Server Error」
print "content-type:text/html;charset=utf-8\n"; と\nが1つでも 「500 Internal Server Error」
となります。

「\n\n」と2つあればエラーにはならないんですが、なぜ必ず2つ必要なのでしょうか?これは改行が2つって意味ですかね?

print "<html>\n"などの\nはソース上やコンソール出力結果上での改行なのはわかります。
この\nは改行したくなければ書かなくてもエラーになりませんよね。(当たり前ですが・・

#!/usr/bin/perl
print "content-type:text/html;charset=utf-8\n\n"; ←HTTPヘッダーの\n\n
print "<html>\n";
print "<body>\n";
print "<p>テキスト</p>\n";
print "</body>\n";
print "</html>\n";

投稿日時 - 2013-04-26 06:48:04

QNo.8060061

困ってます

質問者が選んだベストアンサー

エラーになるのは、CGIとして間違っているからであって、Perlとしての間違いではありません。

http://okwave.jp/qa/q8060013.html

> ヘッダ(複数行の場合あり、空行不可)
> 空行
> 本体

print "content-type:text/html;charset=utf-8\n\n";

print "content-type:text/html;charset=utf-8\n"; # HTTPヘッダ:改行までが一つの項目
print "\n"; # ヘッダの終端
を1つにまとめたものです。

投稿日時 - 2013-04-26 07:55:15

お礼

皆さんとても分かりやすいご説明ありがとうございました。
はっきり言って基礎の勉強不足でした。

Perlとしてはあっているが、CGIとして記述するときはHTTPの仕様では

「HTTPヘッダー +ヘッダーの終端(空行)」が必要なんですね。

それを2つ目の空行はHTTPヘッダーにくっつけて1行で書いてもいいし、
2行目に単独で空行を書いてもいいってことなんですね。

投稿日時 - 2013-04-26 16:47:19

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

そういう決まりだからです。
詳しくはCGIについての決まり事が書かれたRFC 3875を見てください。
http://tools.ietf.org/html/rfc3875#section-6

CGIではヘッダー、改行文字 (ドキュメントではNLと書いてあります)、もしあったらボディという流れでレスポンスを出さなくてはなりません。
6.3節 (http://tools.ietf.org/html/rfc3875#section-6.3) にある通り、各ヘッダーは改行で終わります。また、6.2節 (http://tools.ietf.org/html/rfc3875#section-6.2) にある通り、ヘッダーを出力した後には必ず改行文字を入れることが決まっています。
つまり、\n\nというのは各ヘッダーの行末に置く\nとすべてのヘッダーを出力したあとに置く\nを連続して書いただけということです。


ちなみに、これはHTTPの仕様 (RFC 2616 / http://tools.ietf.org/html/rfc2616#section-4) で決まっているレスポンスメッセージとは色々違います。

投稿日時 - 2013-04-26 08:45:27

ANo.3

インターネットで行われる通信プロトコルでは、データの種類などを知らせるheaderとbodyが送られます。HTTP/Mail/FTP/など・・
 言い換えれば、headerに続いて、空行をはさむことで、その区別をしているのです。もし空行がないと、header自体が終わらなかったり、本文がなかったりですからEroorになるのです。言い換えれば提供サーバーのエラーになります。

投稿日時 - 2013-04-26 08:20:54

ANo.1

これはPerlの問題ではなく、HTTPの仕様です。
ヘッダ部分とコンテンツ本体を区別するために、間に空行を一つ挟みます。
メールとかもそうですね。

投稿日時 - 2013-04-26 07:42:03