PerlでHTTPヘッダの改行を外すとエラーになるのはなぜ?
- PerlでHTTPヘッダの最後の改行を外すとエラーが発生します。改行を外す場合には注意が必要です。
- 改行の数が2つ必要なのは、HTTPヘッダーの仕様に基づくものです。改行は2つ必要なため、1つだけ外すとエラーになります。
- 改行はソースコード上やコンソール出力結果上の改行であり、指定しない場合でもエラーにはなりません。
- ベストアンサー
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";
- testmaster_x
- お礼率35% (132/371)
- Perl
- 回答数4
- ありがとう数1
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
エラーになるのは、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つにまとめたものです。
その他の回答 (3)
- hanabutako
- ベストアンサー率54% (492/895)
そういう決まりだからです。 詳しくは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) で決まっているレスポンスメッセージとは色々違います。
- ORUKA1951
- ベストアンサー率45% (5062/11036)
インターネットで行われる通信プロトコルでは、データの種類などを知らせるheaderとbodyが送られます。HTTP/Mail/FTP/など・・ 言い換えれば、headerに続いて、空行をはさむことで、その区別をしているのです。もし空行がないと、header自体が終わらなかったり、本文がなかったりですからEroorになるのです。言い換えれば提供サーバーのエラーになります。
- shiren2
- ベストアンサー率47% (139/295)
これはPerlの問題ではなく、HTTPの仕様です。 ヘッダ部分とコンテンツ本体を区別するために、間に空行を一つ挟みます。 メールとかもそうですね。
関連するQ&A
- PerlでのHTTPヘッダのStatus変更
内部処理の結果に応じて、成功の場合は「200 OK」、失敗の場合は「503 Service Unavailable」をHTTPヘッダのStatusに指定して返したいと思っています。 ヘッダを "Content-Type: text/html\n\n" だけにして返す場合は問題ないのですが、その前に "Status: HTTP/1.1 200 OK\n" や "Status: HTTP/1.0 503 Service Unavailable\n" を追加するとInternal Server Errorになってしまいます。 [現状] -------------------------------------------- $ret=system("コマンド"); $header = "Status: HTTP/1.1 200 OK\n"; $cmt = "OK"; if ($ret == 256) { $header = "Status: HTTP/1.0 503 Service Unavailable\n"; $cmt = "NG"; } $header .= "Content-Type: text/html\n\n"; print "$header"; print "$cmt"; exit; -------------------------------------------- なにか、Statusを変更する良い手段はないでしょうか? よろしくお願いします。
- ベストアンサー
- Perl
- perl CGIでのhttpヘッダー出力 (Content-type:
perl CGIでのhttpヘッダー出力 (Content-type: text/html\n\n) が不要な場合について perlでCGIを作成しています。 多くの場合は、httpのヘッダー出力(Content-type: text/html\n\)を行っています。 毎回ではないですが、HTTPヘッダーの出力が不要な場合が存在します。 (HTMLにContent-type: text/html\n\が出力され表示されます。) そこで、HTTPヘッダーの出力が不要の場合の判断方法を教えていただければと思います。 よろしくお願いいたします。
- 締切済み
- Perl
- HTTPヘッダー制御について
現在、vue、laravelを使って開発をしています。 基本的なことになりますが2つ質問があります。 よろしくお願いします。 ① 例えば、リクエストヘッダに、 『Content-Type:text/plain; charset=UTF-8』があった場合、 laravelが、『受け取ったのは「テキストでUTF-8」だな』と判断しているのでしょうか。 ② 例えば、レスポンスヘッダに、 『Content-Type:text/plain; charset=UTF-8』があった場合、 ブラウザ、もしくはaxios(js?)が、『受け取ったのは「テキストでUTF-8」だな』と判断しているのでしょうか。
- 締切済み
- PHP
- Ruby CGI HTTPヘッダ
Rubyで、 CGIがクライアント(ブラウザ等)から受けたHttpリクエストヘッダとその値を全て取得して表示したいです。(どのようなヘッダが付与されても) 以下を例に教えてください。 #!/usr/bin/ruby require 'cgi' cgi = CGI.new puts "Content-Type:text/html\n\n" puts "<html>\n" puts "<body>\n" #ここにどのように書いたら良いですか? puts "</body></html>\n"
- ベストアンサー
- その他(プログラミング・開発)
- perlでHTTP Request Headersの情報を取得、表示す
perlでHTTP Request Headersの情報を取得、表示するページを作成したい 当方初心者です。 apache上のCGI(perl)で、ブラウザから受け取った HTTP Request Headersの情報を取得、出力するページを作成したいのです。 調べると下記のようなサーバ環境変数の取得、表示方法は多数ヒットするのですが =================================================== #!/usr/bin/perl -- print << "DOC1"; Content-type:text/html\n\n <HTML><BODY> DOC1 print $ENV{'HTTP_USER_AGENT'}<br>\n"; print $ENV{'REMOTE_ADDR'}"; print << "DOC2"; </BODY></HTML> DOC2 =================================================== 今回は、環境変数からではなく、HTTP Request Headersから 直接ヘッダに格納された情報を取得したいのです 取得・表示したい情報は標準HTTPヘッダ情報に加え、 途中で経由するプロキシが追加するヘッダ情報です。 完成イメージとしては PHPの<? phpinfo() ?>で出力できる 添付画像にあるような形なのですが どのようにすればできるのでしょうか サンプルの形で教えて頂けると助かります 参考になるページでも結構です よろしくお願いします
- ベストアンサー
- SE・インフラ・Webエンジニア
- HTTPヘッダーがどうしてもISO-8859になる
Apache2.2.4(ソースからインストール)を使っています。 以下の問題は,IEなら問題ありません。すべてFirefoxで見る場合のみです。 HTTPヘッダーに 「Content-Type: text/html; charset=ISO-8859-1」が 入ってしまい,metaヘッダーにどんなcharsetを指定しても FirefoxがISO-8859と解釈して,文字化けを起こします。 httpd.confには, AddDefaultCharset ISO-8859の行はありません。 しかし, AddDefaultCharset UTF-8や AddDefaultCharset none と指定しても,ヘッダーにcharset=ISO-8859-1が表示されることには 変わりなく,問題解決しません。 .htaccessファイルは一切使っていません。 この問題はCGIに関係なく,任意のファイルで発生します。 一体,なぜISO-8859がヘッダーに現れるのでしょうか。
- 締切済み
- HTML
- UTF-8でソースを書くとエラーになる
WinXPにApache2.0とperl5.8を入れて動作させているのですが、perlCGIをUTF-8で書くと500エラーになり表示することができません。 該当のソースは #!/usr/bin/perl package HTML; sub HEADER{ print "Content-type: text/html\n\n"; print << " -----END-----"; <!DOCTYPE HTML PUBLIC -//IETF//DTD HTML//EN> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf8"> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <title>Test Program</title></head> <body>\n -----END----- } sub FOOTER{ print "</body></html>"; } &HTML::HEADER; print"テスト"; &HTML::FOOTER; 上と同じものをsjisで保存すると、こちらは正常に動作します。打って変わってこれをUTF-8で保存するとエラーが起こってしまいます。 error.logには C:/Apache2/htdocs/script/base.pl is not executable; ensure interpreted scripts have "#!" first line (9)Bad file descriptor: don't know how to spawn child process: C:/Apache2/htdocs/script/base.pl と記録されていて、これを頼りにググってみましたが有効そうな情報を見つけられませんでしたので、どうか原因と解決策を教えてください。
- ベストアンサー
- Perl
- sendmail でのヘッダ部分Content-Transfer-Encodingについて
あまりPerlに精通しておりませんが、よろしくお願いします。 Perl でフォームからメールを送信するページを作成しましたが、メールヘッダの部分に --------------- print OUT "Content-Type: text/plain; charset=iso-2022-jp\n"; print OUT "Content-Transfer-Encoding: 7bit\n"; print OUT "MIME-Version: 1.0\n"; --------------- という風に書いているのに、届くメールは Content-Type: text/plain; charset=iso-2022-jp MIME-Version: 1.0 になって、Content-Transfer-Encoding: 7bit が抜け落ちます。(場合によっては、Content-Transfer-Encoding: base64 になる) どういった原因が考えられるか、アドバイスいただければ幸いです。よろしくお願いします。
- ベストアンサー
- Perl
- Perlからjavascript構文の出力について
はじめまして。 現在javascriptを勉強中の者です。 PerlからHTML構文内にjavascript構文を追記し出力しようとしていますが、追記してPerlを実行させただけでInternal Server Errorとなってしまいます。 過去ログをいくつか見させて頂きましたが、自分のソースのどこが悪いのかさっぱりです;; やりたいことは、登録完了ポップアップを表示させるだけです。 表示条件等は別として、まずjavascript構文をソースに追記してポップアップを表示させたいです。 どうか良きアドバイスをお願い致します。 #!/usr/bin/perl require "cgi-lib.pl"; print "Content-type: text/html\n\n"; print qq! <HTML> <HEAD> <META Http-Equiv="Content-Type" Content="text/html;charset=EUC-JP"> <META name="robots" content="noindex,nofollow"> <TITLE>登録画面</TITLE> </HEAD> <BODY> <script type="text/javascript"> <!-- alert("登録完了"); // --> </script> <FORM ACTION="test.cgi" METHOD="post"> <FONT SIZE="4"><B>登録画面</B></FONT> </BODY> </HTML> !;
- ベストアンサー
- Perl
- Perlスクリプトが、ローカルでは実行できるが、HTTP経由では実行できない
現在Perlスクリプトを作成し サーバにアップしました。 SSHでサーバにログインし #perl a.cgi と実行したところ(CGIとして動作させるため。中身はPerlスクリプト) Content-type: text/html <html> <body> あああああ </body> </html> のようなメッセージが表示され正常に動作しているとおもいます。 しかし、 http://www.hoge.com/a.cgi をURLとしてブラウザ上で実行すると 500 Internal Server Error になります。 パーミッションは755で正常 Perlのパスは#!/usr/bin/perlとしており、これも正常です。 文字コードはeuc-jp 改行コードLF サーバはApache/1.3.33 Perlバージョンは5.8.4 自分のパソコン上でperl+HTTPサーバ(httpd)を使うと HTMLふぁいるとして出力されます。 サーバ上でHTTPを使ってアクセスしたときのみエラーとなります。 このような現象が起こるのですが原因がわかりません。 お願いします。
- ベストアンサー
- Perl
お礼
皆さんとても分かりやすいご説明ありがとうございました。 はっきり言って基礎の勉強不足でした。 Perlとしてはあっているが、CGIとして記述するときはHTTPの仕様では 「HTTPヘッダー +ヘッダーの終端(空行)」が必要なんですね。 それを2つ目の空行はHTTPヘッダーにくっつけて1行で書いてもいいし、 2行目に単独で空行を書いてもいいってことなんですね。