2019-06-13
header()を使用してページ遷移を行わせる
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