ユーザーのログイン状態や特定の閲覧条件によって、リアルタイムに行き先を振り分けたいとき」にはアプリケーション層(プログラム側)で301リダイレクトを設定する必要があります。
今回はその代表例として、PHPでの設定方法を紹介します。
301についての概要は以下の記事をご覧ください。

PHPで301リダイレクトを設定する方法
PHPでステータスコード301(恒久的な移動)を指定するには、header関数を用います。
基本の記述例
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://example.com/new-url/");
exit;
【推奨】より安全で簡潔な「1行」の書き方
実務では、以下の第3引数を使った書き方が推奨されます。
<?php
// 第3引数に301を指定することで、ステータスコードを確実に上書き
header("Location: https://example.com/new-url/", true, 301);
exit;
この書き方であれば、header(“Location: …”) だけを書いてデフォルトの「302(一時的な移動)」になってしまうミスを確実に防ぎ、SEO評価を正しく引き継ぐことができます。
PHPで設定する際の注意点
1. リダイレクト直後に必ず exit; を置く
header() 関数はブラウザに「移動しろ」という命令(ヘッダー情報)を送るだけで、その後のPHP実行を止める機能はありません。
もし exit; を書き忘れると、ブラウザが移動を開始しようとしている裏側で、サーバー上のプログラム(データベースの更新や個人情報の取得など)が最後まで走り続けてしまいます。セキュリティリスクや予期せぬデータの不整合を招くため、必ずセットで記述してください。
2. header の前に「1文字」も表示させない
PHPの仕組み上、ブラウザに何かを表示(出力)した後は、リダイレクトの命令を送ることができません。 以下の「やってはいけないこと」を徹底してください。
<?php の前にスペースや改行を入れる :たった1つの空行も「表示データ」とみなされ、エラーになります
header の前で echo や print を使う :「読み込み中…」などの文字を先に出すと、リダイレクトは機能しません
ファイルの保存形式を「BOMあり」にする :(目に見えないデータが先頭に含まれてしまい、エラーの原因になります)
これらが原因で Warning: Cannot modify header information というエラーが出る場合、リダイレクトは完全に無視されます。
PHPでリダイレクトを行うべき具体的なシーン
サーバー設定による一括転送ではなく、PHPで処理を書くのは主に以下のような「条件付きの振り分け」が必要な時です。
- デバイス判定: ユーザーエージェントを判定し、スマホ専用URLへ301転送する。
- データベース連携: 古い商品IDへのアクセスを、現在の最新URLへデータベース照合後に飛ばす。
- キャンペーン制御: サーバーの時刻(date()関数)をもとに、特定の時間帯だけ別ページへ案内する。
まとめ:正しく書いてSEOと安全性を両立させる
PHPによる301リダイレクトは、柔軟なサイト運用を可能にしますが、一歩間違えるとセキュリティホールやSEO評価の損失に繋がります。
- 301を明示して検索エンジンに「移転」を伝える
- exit; を併記して後続処理を遮断する
- エラーの原因となる「出力」を直前に置かない
この3点を徹底し、安全で正確な転送処理を実装しましょう。







