止むに止まれずPHPで301/302リダイレクトする

移転に伴うドメインのリダイレクト処理をした。
通常は .htaccess 等 apache や nginx でリダイレクト設定をするが、とある事情でphpで設定したメモ

リダイレクトで使うHTTPレスポンスステータスコード 301 と 302 の違い

リダイレクト処理で用いるHTTP レスポンスステータスコードとして 301 と 302 がよく言及されるが、ドキュメントはこう記載されている。

リダイレクションメッセージ
301 Moved Permanently
 リクエストされたリソースの URL が永遠に変更されたことを示します。レスポンスで新しい URL が与えられます。
302 Found
 このレスポンスコードは、リクエストされたリソースの URI が一時的に変更されたことを示します。 URI は将来、さらに変更される可能性があります。従って、クライアントは将来のリクエストでも同じ URI を使用するべきです。

簡単にまとめるとこんな感じ?

  • 301 Moved Permanently
    • ホスティング元変更、ドメイン変更等で永遠に変更される時に利用する(引っ越し)
  • 302 Found
    • 301とは異なり、一時的な移動

一般的に検索エンジンは 301 の場合は、過去に蓄積したデータも関連付けして引き継がれるため、引っ越しの場合は301が良いみたいだ。

今回は、移転に伴うドメインのリダイレクトなので、 301 で実施する。
※一時的な移動の場合は下記コードの 301 を 302 にして利用する。

サンプルコード

単純にリダイレクトするだけのコード

<?php
$DOMAIN='https://hoge.com';
http_response_code(301);
header('Location: '.${DOMAIN} );
exit;
?>

リクエスト内容を新しいドメインへ引き継いでリダイレクトするコード

上記のコードだと、 https://www.fuga.com/post/dialy1/ みたいな特定パスへのリンクの場合も、全て一律で https://hoge.com へリダイレクトされてしまうため、受け取ったリクエスト(上記例だと /post/dialy1/ 部分をリダイレクト先のドメインへ引き継いでリダイレクトする。

<?php
$DOMAIN='https://hoge.com';
$URI=htmlspecialchars( $_SERVER["REQUEST_URI"], ENT_QUOTES, 'UTF-8' );
http_response_code(301);
header( 'Location: '.${DOMAIN}.${URI} );
exit;
?>

このコードだと下記の通りリダイレクトされる。
https://www.fuga.com/post/dialy1/

https://hoge.com/post/dialy1/

未来の自分へ伝言出来たかな。