header による転送を行ったところ、画面が真っ白に!!!
なんて経験があると思いますが、私もつい先日同じ様な現象が発生しました
しかも開発環境、テスト環境では正常に転送されたのに本番環境だけで!
発生時の対処法や見落としがちなポイントを実経験を元にご紹介します。
基本的な書き方
<php header('Location: http://mypage.web/'); exit(); ?>
<?php $user_id = 10; header('location: user.php?mode=edit&id='.$user_id); exit(); ?>
特に説明もいらないと思いますが、こんな感じに書きます。
真っ白にならないためのには?
いろいろなサイトでも紹介されておりますが、
Locationと:の間にはスペースを入れない
header(‘Location : http://mypage.web/’); ← NG Location と : の間にスペースは入れてはいけません
header(‘Location: http://mypage.web/’); ← OK
headerの直後にexitを呼ぶ
exit(); が無いと、その後の処理も行われてしまいます。
転送するということは、そこで処理は終了にする事になるので exit(); をしましょう
headerより前で出力を行わない
echoやprintなどで出力を行っているとそちらが先に出力されてしまい転送が行われません
<?php ~ ?> でphpプログラムは囲われていますが、<?php より前、 ?> より後はクライアント側に出力されてしまうので注意が必要です。
UTF-8のBOMありで保存しない
phpファイルをUTF-8のBOMありで保存していると転送されません。
見落としがちなポイント
これは実際に私が陥った現象なのですが、 require_once で取り込んだ php ファイルの最後の ?> の後に空白行の改行が入っておりました。
この改行が出力されてしまったため転送がされずに画面が真っ白になってしまっていました。
headerで転送を行う際にはrequire_onceで取り込むファイルにも注意が必要です。
まとめ
<?php ~ ?> の外側の空白改行は普通に処理する分には何も問題がありませんが、headerで転送を行う際には真っ白になる原因になってしまうので注意が必要ですね
今回はまり大きな規模のシステムではなかったので取り込むファイルも少なかったために早めに発見できました。
ただ、なぜ本番環境だけダメだったのかが不明です
※開発環境:Windows、テスト環境:Mac、本番環境:CentOS という状況で本番環境のみで発生していました。
コメントを残す