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の様々な仕組みの理解が必要ですね。