Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

301でジャンプ

研究内容

Locationでジャンプするときのステータスを「301 Moved Permanently」にする研究です。

詳細と結果

HTTPステータス

ウェブサーバーにアクセスすると、次のような情報がブラウザに返されるんでした。

HTTPヘッダ
HTTPヘッダ
HTTPヘッダ
…
(空行)
実際のデータ

…これ、少し間違っていたようです。すいません。 実際は、先頭に1行「HTTPステータス」があるんだそうです。 次のように。

HTTPステータス
HTTPヘッダ
HTTPヘッダ
HTTPヘッダ
…
(空行)
実際のデータ

この「HTTPステータス」は、CGIプログラムが出力しなくても、ウェブサーバーが自動的に出力してくれます。 ステータスというのは、そのURLにアクセスした結果が、成功したのか失敗したのか、 そういった情報を表していて、普通にウェブページにアクセスした場合は 「HTTP/1.1 200 OK」、CGIプログラムでエラーが発生した場合は 「HTTP/1.1 500 Internal Server Error」などのようなテキスト行になります。 「Internal Server Error」は我々はよく見ますね (^^; 「HTTP/1.1」というのは、それがHTTPの通信でバージョンが1.1ですという意味ですね。

このHTTPステータスは、CGIプログラムが"直接"出力することはできません。 ウェブサーバーが自動的に出力しています。 ですので、例えば次のようにしてもダメです。

#!/usr/bin/perl

print << "EOM";
HTTP/1.1 200 OK
Content-type: text/html

Hi!
EOM

このプログラムを実行するにはここをクリック。 「Internal Server Error」エラーになりますね。 それじゃ、CGIプログラムでこのHTTPステータスを制御することは できないのかっていうと、そうでもありません。次のようにすることで、 CGIプログラムからHTTPステータスを制御することができます。

#!/usr/bin/perl

print << "EOM";
Status: 200 OK
Content-type: text/html

Hi!
EOM

このプログラムを実行するにはここをクリック。 ちゃんと実行されました。 出力している1行目の「Status:〜」ですが、ここに注意です。 この出力は、直接ブラウザには送られません。 ウェブサーバーに、「HTTPステータスをこれにしてください」ってお願いするんです。 ウェブサーバーは、この行を見て、こちらのお願いを理解して、そのようにHTTPステータスを設定してくれます。 そして、この「Status:〜」の行は、ブラウザには送られずに削除されます。 あと、「Status:〜」には「HTTP/1.1」は付けません。ウェブサーバーが付けてくれます。

では、次のようなことをしてみましょう。

#!/usr/bin/perl

print << "EOM";
Status: 200 おっけーだす!
Content-type: text/html

Hi!
EOM

このプログラムを実行するにはここをクリック。 実行できました (^^; HTTPステータスで重要なのは、最初の200という数字なんですね。 200というのは、正常ですっていう意味でした。 この「おっけーだす!」をブラウザで確認できないのが残念です。

さらに実験を続けましょう。 今度は、正常に動いているCGIプログラムから 「500 Internal Server Error」を出力してみます。

#!/usr/bin/perl

print << "EOM";
Status: 500 Internal Server Error
Content-type: text/html

Hi!
EOM

このプログラムを実行するにはここをクリック。 「Status:〜」の行を変更しただけですが、エラーになりましたね。 正常に動いているということです。分かりにくいですけど (^^;

LocationでジャンプしたときのHTTPステータス

Locationで別のページにジャンプするには次のようにすればいいんでした。 このプログラムを実行するにはここをクリック

#!/usr/bin/perl

print "Location: http://www.yahoo.co.jp/\n\n";

さてここで、「Location」でジャンプしたときのHTTPステータスがどうなっているのかということです。 これが本題です。 HTTPステータスは、ブラウザ上で確認できないのですが、答えは次のようになるんだそうです。

302 Moved Temporarily

これは、「リクエストされたページは、一時的に他の場所にあります」という意味なんだそうです。 ですので、例えば "yahoo.cgi" というCGIプログラムで、Locationヘッダを使って Yahoo!Japanにジャンプした場合、 「リクエストされた "yahoo.cgi" は、一時的にYahoo!Japanにあります」という意味になるんだそうです。 これ、正しくないんだそうです。「一時的」というのは、今は別の場所にあるけど将来はまた戻ってくる という意味ですね。でも、Yahoo!Japanが "yahoo.cgi" に戻ってくる?そんなことは絶対にありえません (^^; ということで、正しいHTTPステータスは次のようなものなんだそうです。

301 Moved Permanently

こちらは、「リクエストされたページは永久に他の場所にあります」という意味なんだそうです。 これが、別のページにジャンプするときのより正しいHTTPステータスです(状況によってですが)。 ですから、Locationでジャンプするときは、次のようにするのが正しいです。 このプログラムを実行するにはここをクリック

#!/usr/bin/perl

print "Status: 301 Moved Permanently\n";
print "Location: http://www.yahoo.co.jp/\n\n";

HTTPステータスはブラウザで確認できないし、実行結果はどちらも同じようなのですが、 正しい方を使うようにしましょう。 正しい方を使っていれば、いいことあるかも?

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。