PHPではheader関数を使うことでリダイレクトを行うことができます。
例えば次は hoge.php というスクリプトにリダイレクトしている例
1 2 3 4 |
/// hoge.php にリダイレクト header( "HTTP/1.1 301 Moved Permanently" ); header( "Location: hoge.php" ); exit; |
単純に Location: hoge.php と飛ぶ先のファイル名(あるいはパス)を渡してあげればいいだけです。
たったそれだけなのに、これが上手くいかないことが結構あります。
そこでheader関数でリダイレクトできないときの対処法についてまとめました。
対処法1.HTML出力後に呼び出してないか確認する
まず1つめは HTML出力後にリダイレクト処理を書いてないか確認する こと
つまり <html> とか <head> とかのタグを出力した後にheader関数でリダイレクト処理をしてないかどうか・・・それを確認するっていうことです。
そのことが詳しく書かれているのはPHPマニュアルの次の部分
覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include または require 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。
引用元 : PHP: header - Manual
しっかりと「すべての実際の 出力の前にコールする必要がある」って書いてあります。なのでheader関数は必ずHTMLを出力する前に呼び出さないと機能しません。
もしHTML出力後に呼び出すと何もしない役立たずコードになります。
例えばHTML出力後にリダイレクトするNGコード例は次の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php /** HTML出力前の処理 */ ?> <html> <head> <?php /// HTML出力後にリダイレクトしたらダメ header( "HTTP/1.1 301 Moved Permanently" ); header( "Location: login.php" ); exit; ?> ... |
上の例だとまだ <html> とか <head> みたいに直に出力してるから分かりやすいです。
ただし echo とか print_r とかでタグ出力してるとなると、、、原因を見つけるのは大変になるかもしれません。その場合は地道に見つけてくしかないです。
あとHTML出力後というのは <html> タグが出力されるまえの空白(改行とかスペース)も含みます。なのでリダイレクト前に余計な空白を出力してないかも要注意ですね。
僕自身、この罠にはまることが多いので気を付けてます。
対処法2.Location と : の間のスペースを取り除く
header関数でリダイレクトできない原因はまだまだあります。
それは Location と コロン( : )の間に余計なスペースを書いてしまう ということ
例えば次が余計なスペースがあるダメダメなコードの例
1 2 3 4 |
header( "HTTP/1.1 301 Moved Permanently" ); header( "Location : hoge.php" ); /// ▲ よく見ると空白が入っている exit; |
上のコードをよ~く見てください。 Location : hoge.php みたいに空白が入っていますよね?
このような Location とその間のコロン( : )が一続きでない書き方は無効になってしまいます。
なので正しい書き方はこうです。
1 2 3 4 |
header( "HTTP/1.1 301 Moved Permanently" ); header( "Location: login.php" ); /// ▲ 空白を入れずに書く exit; |
Location と コロン( : ) の間は離さず書くように意識しましょう。というか離して書いてしまうと全く動きません。
対処法3.パスを間違えてないか確認
リダイレクトする時、相対パスや絶対パスを使うことがあると思います。
例えば次のコードのような感じで
1 2 3 4 5 6 7 8 9 10 11 |
/// 相対パスでリダイレクトする場合 $uri = '/path/to/redirect.php'; header( "HTTP/1.1 301 Moved Permanently" ); header( "Location: {$uri}" ); exit; /// フルパスでリダイレクトする場合 $uri = '/home/hoge.com/www/public_html/path/to/redirect.php'; header( "HTTP/1.1 301 Moved Permanently" ); header( "Location: {$uri}" ); exit; |
このパス指定は案外間違えやすいものです。
特に相対パスとかで指定してしまった場合、後でディレクトリ構成が変わった時にかなり困ります。(あとCronジョブとかも正常に動かなくなる・・・)
なのでリダイレクト先のパスが間違っていないかの確認も忘れずに
ちなみにフルパスで書く場合は $_SERVER['DOCUMENT_ROOT'] を使うのが楽です。
これはドメイン直下までのフルパスを返してくれるサーバー変数で、リダイレクトの場合だと次コードのような感じで使えます。
1 2 3 4 5 |
/// フルパスでリダイレクト $uri = $_SERVER['DOCUMENT_ROOT'] . '/path/to/redirect.php'; header( "HTTP/1.1 301 Moved Permanently" ); header( "Location: {$uri}" ); exit; |
こう書くと /home/hoge.com/www/public_html みたいな長くて分かりにくいパスを省略できるので結構便利です。間違いを防ぐにはこの書き方が最適かも
ここまでのまとめ
リダイレクトできない対処法をまとめると次の通り
- HTML出力後に呼び出してないか確認
- Locationとコロン(:)の間に空白を書かない
- リダイレクト先パスが間違えてないかチェック
もしリダイレクトが機能しないという場合、この3つを試すと上手くいくことが多いです。
以上、PHPのheader関数でリダイレクトできないときの対処法でした。ではでは($・・)/~~~