2019-06-13

header()を使用してページ遷移を行わせる

PHPに関する記事

header()は、サーバサイド(この場合はPHP)からHTTPヘッダをブラウザに送信するという関数です。
ブラウザでアクセスしてくれたユーザに、ヘッダ情報を送ることができます。

ユーザがページにアクセスした際に、別のページへ遷移させる方法自体はいくつかあり、HTMLはもちろんJavaScript実現可能です。PHPのheader関数を使うべきなのはどのようなシーンなのでしょうか。

header()関数でLocationヘッダを送る

Location:ヘッダを送信すれば指定したページへリダイレクトすることができます。
次のスクリプトでは$urlに指定したURLにジャンプします。

<?php
$url = "https://example.com/";
header("Location: " . $url);

exit();

参考:https://www.php.net/manual/ja/function.header.php

phpのheader()で転送する場面

サーバサイド(PHP)でログイン認証処理を行なっているような場合、アクセス時にユーザが未ログインであれば、認証情報の入力ページにリダイレクトさせてログインを促す、といった場合が考えられます。サーバサイドの処理の中で、条件にしたがって使用するリダイレクトです。

スポンサーリンク

発生しがちなエラー

header()関数について以下のような理由でエラーを発生させてしまいがちです。
次のような記述を行なった場合エラーが発生してしまいますので注意しましょう。

リダイレクト関数の実行前には何も出力しない

<!DOCTYPE html>
<?php
$url = "https://example.com/";
header("Location: " . $url);

exit();

上記は、リダイレクト関数の実行前に、DOCTYPEの記述が出力されてしてしまっています。
header関数によってHTTP headerを送信する場合には、header関数より前に、いかなる文字列も出力してはいけません。

リダイレクト関数の実行前には改行、空白文字を入れない

<!-- ↑空白、改行が入っている↑ -->
<?php
$url = "https://example.com/";
header("Location: " . $url);

exit();

気づきにくいため、初心者はやってしまいがちなケースです。

オプションでHTTPステータスコードを記述する

SEOの観点で、リダイレクトの意図を明確に伝えるた方が望ましいようです。意図に合致するHTTPステータスコードをリダイレクト時に明記することは、Googleも推奨しています。
ドメインの変更に伴うサイトリダイレクトにおいては、旧サイトへのアクセスを永続的に転送させたい、ということがあります。そういった場合にはヘッダにステータスコードを記述しましょう。header関数の引数で渡すことができます。

<!DOCTYPE html>
<?php
$url = "https://example.com/";
header("Location: " . $url, true, 301);// 301転送を明示

exit();

リダイレクト関連のHTTPステータスコードには、下記のようなものがあります。

HTTP Status Code 定義
301 Moved permanently
302 Found
303 See other
307 Moved temporarily

PHPでは、このheader関数に引数を渡さない場合、302(一時的な転送)がデフォルトで指定されます。

スポンサーリンク

転送処理後exitを記述する

リダイレクト自体は問題なく動作しますが、転送処理を行わない場合に続く処理など、スキップすべき処理等がある場合は以降の処理を停止しましょう。またクローラーなどのボットは、HTTPヘッダー情報を無視してページの内の続行することがあります。

exit();を明記することで、スキップすることができますので、作法として記述するようにした方が望ましいでしょう。

参考:https://php.net/manual/ja/function.exit.php