PHPでリダイレクトする方法

こんにちは、さるまりんです。

ちょっと大きめのプログラムを書いているんですが、その中でハマったことがあったので、戒めもかねてメモさせてもらます。

リダイレクト(redirect)です。指定されたページから自動的に違うページに誘導します。転送の方がしっくりくるかな。

これにはHTMLでする方法、JavaScriptでする方法、サーバーの設定でする方法などがありますが、今回はプログラム的にPHPでやってます。

PHPでリダイレクト

簡単です。シンプルです。これでいけます。

header('Location: [リダイレクト先URL]');
exit;

例えば

header('Location: https://salumarine.com/');
exit;

で、ここのトップページにリダイレクトしてくれます。

header()関数はリンク先の本家のドキュメントに書いてある通り、HTTPヘッダーを送信するために利用します。リダイレクトはLocation:ヘッダーで実現できます。

フレームワークなどを使ってると、それらが関数を用意してくれていることが多いですが、中身は上記のように実装されていると思います。

headerを呼んだ後はもう実行する処理はないのでexitでプログラムを終了します。

あ、リダイレクト自体でハマったわけではないんです。それはまさに上記のリンク先に書いてくれていることでした。

注意:全ての出力の前に実行せよ。

考えてみれば当たり前のことなんですが、HTMLででも、PHPででも何かしら出力してしまった後ではリダイレクトは効きません。そりゃそうですよね。すでに何か出力され始めているのですから、そこから移動しろって命令されても困ってしまいます。

僕がハマったのはincludeしているファイルからでした。

次のようなファイルをincludeするプログラムだったのですが、

<?php
// PHPのコード
?>

<?php
// 別のPHPのコード
?>

PHPのコードとコードの間に1行空白行があります。この行が悪さをしました。この後にheader()を呼んでも期待通りに動作しなかったというわけです。

これで結構な時間悩まされました。。

プログラムって律儀ですね。言った通りに動いてくれるから、余計なことを言ってるとそれもちゃんと解釈してくれます。

忘れないようにメモです。戒めです。スペース一つも立派な出力です。

読んでくださってありがとうございます。

ではまた!