PHPでの301リダイレクト設定の方法

ユーザーのログイン状態や特定の閲覧条件によって、リアルタイムに行き先を振り分けたいとき」にはアプリケーション層(プログラム側)で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評価の損失に繋がります。

  1. 301を明示して検索エンジンに「移転」を伝える
  2. exit; を併記して後続処理を遮断する
  3. エラーの原因となる「出力」を直前に置かない

この3点を徹底し、安全で正確な転送処理を実装しましょう。

関連記事:Apacheでの301リダイレクト設定の方法

関連記事:WordPressでの301リダイレクト設定の方法

よかったらシェアしてね!
  • URLをコピーしました!
目次