PHPのheader関数のおさらい

このnoteではPHPのheader関数をおさらいします。

PHPのheader関数について

php.netによると、header関数は以下のように説明されています。

header - 生のHTTPヘッダを送信する

...ふむ。ということは、header関数は理解するには、HTTPの仕組みを理解する必要があるということになります。
HTTPとはブラウザとWebサーバー間の通信プロトコル(通信ルール)です。ブラウザから「このWebページが見たい」とHTTPリクエストを送り、そのリクエストに応じてWebページがHTTPレスポンスを返します。HTTPレスポンスは、「HTTPステータスライン」「HTTPレスポンスヘッダ」「HTTPレスポンスボディ」の3つから成り立ちます。
PHPのheader関数は、このHTTPレスポンスの中の1つである、HTTPレスポンスヘッダの内容を決めることのできる関数です。

HTTPヘッダを理解する

ということで、PHPのheader関数を理解するために、HTTPレスポンスヘッダについて理解しましょう。HTTPレスポンスは、実際にはプレーンテキストであり、Webブラウザで解釈されます。

header関数では、HTTPレスポンスのヘッダ部分の指定します。実際にheader関数を下のように定義します。

<?php

header("HTTP/1.0 404 Not Found");
// http_response_code(404)と同じ処理をする

?>

このファイル(今回はtest.phpというファイル名にしました)をWebブラウザ(今回はChrome)で見てみると...

こんな感じで表示されます。

header関数でリダイレクトする

HTTPレスポンスでは、サーバがリダイレクトを発生させることができます。ファイルツリーが下のようにあったとします。

root/
    └ test
        ├ test.php
        └ test2.php

この構造で、"test.php"へリクエストがあった場合、test2.phpへリダイレクトさせたいとします。このような場合は

<?php // test.phpです

header("Location: ./test2.php"); // test2.phpへリダイレクト
exit(); //残りのコードを実行させない場合にexit()を実行する

?>

上記コードでは、Webブラウザから"test.php"へリクエストがあった場合、同一ディレクトリ内にある"test2.php"へリダイレクトさせています。この例では相対パスによってリダイレクト先を決めていますが、実際には絶対パスで書くことが推奨されています。

上記のコードは下のように改善することができます。

<?php // test.phpです

header("Location: http://localhost/test2.php"); //絶対パスで指定
exit();

?>

上記のコードはまだURLが短いのでこれでも大変ではありません。しかしファイル構造が複雑な場合、またサーバーを移行しても手を加える手間を減らすため、下のように改変すると便利です。

<?php

header("Location: http://" . $_SERVER["HTTP_HOST"] . dirname($_SERVER['PHP_SELF']) . "/test2.php");
exit();

?>

$_SERVER["HTTP_HOST"]ではサーバーのホスト名、dirname($_SERVER['PHP_SELF'])では現在のファイルのディレクトリを取得しています。


Webアプリケーションの作成などは、Webの様々な仕組みの理解が必要ですね。

いいなと思ったら応援しよう!