別のページやサイトに移動させたいとき、header関数をよく使います。
フォーム送信完了後に自動的に別のページに遷移させたり、ログイン処理の判定など、使い方も様々ですね。
PHPでのリダイレクトの方法は簡単ですが、header関数の前に何かしら出力してしまいエラーにハマる人も多いようです。
そんなよくあるエラーもご紹介しますので、なぜか上手くいかない人もこれをチェックすればすぐに解決できるでしょう。
目次
パラメータ「Location」を付加する
PHPでのリダイレクトの方法は以下のようにheader関数にLocationパラメータを付加し、ヘッダーを書き換えます。
1 2 3 4 |
<?php header('Location: http://www.example.com'); exit; ?> |
以上です。
上記のようにhttp://
から始まる絶対パスの他に、../
などから始まる相対パスでも記述できます。
exit は誤作動防止のために原則付けるようにする
exit
は必須ではありませんが、ページ遷移後の処理を止めたい場合は記述しましょう。
exit
を記述しなかったばっかりに、以下のような誤作動を起こすこともあるため、基本的には付けるようにした方が良いでしょう。
exit を付けないとリダイレクト後も処理は継続する
exit
を付けなかったばかりに、メールを誤送信してしまったケースを紹介します。
1 2 3 4 |
header('location: http://www.example.com'); // メール送信のスクリプト mb_send_mail('info@example.com', 'ほげほげ', 'テストメール'); |
上記はリダイレクトの後にメール送信のスクリプトがありますが、リダイレクト後に’ほげほげ’という件名でテストメールが誤送信されてしまいます。
以下のようにexit
を付けることで、その後の処理は中断されるため、必ずexit
は付けるようにしましょう。
1 2 3 4 5 |
header('location: http://www.example.com'); // exit により、ここで処理は中断する exit; // メールは送信されない mb_send_mail('info@example.com', 'ほげほげ', 'テストメール'); |
参考:PHPでメールを日本語で送信する簡単な方法(mb_send_mail)
header関数でのリダイレクト時によくあるエラー
上記のように記述してもページ遷移しない場合は以下の様なエラーが考えられます。
header関数よりも前にechoやhtmlなど、何かしら出力してしまっている。
header関数よりも前に何かしら出力すると、その時点でヘッダーが送信されるため、エラーになります。
文字を表示させたらダメということです。
(改行やスペース含む)
例えば以下の例です。
1 2 3 4 |
<?php //←改行が入ってしまっている。 header('Location: http://www.nirnir.com'); ?> |
1 2 3 4 |
<?php //↑phpタグの前にスペースが入ってしまっている。 header('Location: http://www.nirnir.com'); ?> |
1 2 3 4 5 |
<p>ありがとうございました。</p> <!--↑ header関数より前にHTMLコードが出力されてしまっている。--> <?php header('Location: http://www.nirnir.com'); ?> |
上記はよくやってしまいがちですが、header関数より前に何らかの出力をすると、以下のようなPHPエラーが発生します。
Warning: Cannot modify header information – headers already sent by (output started at …
既にヘッダーが送信されているため、header関数を実行できないというエラーです。
header関数を記述する際は、その前で何も出力しないようにしましょう。
header関数の前に何も出力していないのにエラーになる!
ちゃんと記述しているのにエラーが出る場合は、以下の原因も考えられます。
- UTF8で保存する際「BOM有り」で保存してしまっている。
「BOM有り」で保存すると、ソース上確認することはできませんが、ソースの一番始めに「UTF8だよ」という記述が追加されてしまうため、エラーとなります。
「BOMなし」で保存しましょう。