PHP

【PHP】リダイレクトさせる方法【header】

PHPでリダイレクトする方法について書きます。

僕はLaravelからPHPに入ったので、生のPHPは疎かな状態です。その勉強過程において知った、PHPでリダイレクトさせる方法について書きたいと思います。

この記事ではリダイレクトについて解説し、PHPでリダイレクトする方法についてまとめます。

なぜリダイレクトする必要があるか

HTTPメソッドのPOSTメソッドを利用しデータベースへ登録処理をリクエストしたとします。

登録が完了した状態でブラウザの更新ボタンをクリックすると、最後にしたリクエストはPOSTメソッドなので、もう一度POSTメソッドでリクエストされてしまいます。

これを避けるためにリダイレクトする必要があります。

最後にされたリクエストがPOSTメソッドだからこの問題が発生しているので、登録処理が終わった後にGETリクエストを送信する事で最後にリクエストしたメソッドをGETメソッドにします。

これにより画面を更新した際にはGETメソッドが実行されるため、予想外の登録処理は実行されません。

では、POSTメソッドでリクエストを送信した後にGETメソッドでリクエストし直すにはどのようにすれば良いのでしょうか。

header関数の利用

header関数を利用する事でリダイレクトを実現することができます。

header関数は生のHTTPヘッダを送信するための関数で、指定したURLにジャンプすることができ、これはGETリクエストとなります。

ですので、登録処理→headerでGETメソッド実行、と言う流れで処理を行います。

header('Location:http://絶対パス', true, 303);
exit();
第一引数 Location: の後にジャンプ先のURLを絶対パスで
第二引数 置換処理を行うかのbool
第三引数 レスポンスコード

となっています。

第一引数にはジャンプ先のURLを絶対パスで書くことです。

第二引数は同じ型の複数のヘッダを生成したい場合はfalseを設定します。Locationは1つで良いのでtrueに設定し置換処理を行ないます。

第三引数はレスポンスコードを強制的に指定するコードでリダイレクトする場合は303を指定します。投稿処理後のリダイレクトの場合は、See Otherを意味する303を指定します。

よくあるバグ

次のコードはPHPのドキュメントから拝借しました。

header関数前に何らかの出力がなされていたり、空白等があると動かなくなりますので注意が必要です。

<html>
<?php
/* これはエラーとなります。この上に出力があることに注目してください。
 * それはheader()のコールより前であるということになります */
header('Location: http://www.example.com/');
exit;
?>

まとめ

PHPで投稿処理を行った後にリダイレクトする方法について書きました。

header関数を利用することにより、指定のURLへジャンプし実現することができ、headerのありがちなバグについて書きました。

何か参考に慣れば幸いです。