🚀

.htaccess不要!CakePHP/PHPでサクッと301リダイレクトした件

に公開

皆さんこんにちは!たから(@D_Treasure0712)です!
Webサイトを運営していると、同じコンテンツに複数のURLでアクセスできてしまう状況に遭遇することがあります。
一見便利に見えるこの状況、実はSEOにとって大きなリスクを抱えているのです!今回は、重複URL問題の解決方法として、PHPを使った301リダイレクトの実装手法を紹介します。

重複URLが引き起こすSEO問題とは

まず、なぜ重複URLが問題となるのかを見ていきます。
例えば、以下のような状況を考えてみてください(どちらもトップページを表示します)。

  • https://example.com/index.php
  • https://example.com/

この2つのURLは、人間の目には「同じトップページ」に見えます。しかし検索エンジンは、これらを全く別のページとして扱います。
その結果何が起こるでしょか?本来なら1つのページに集約されるべきSEO評価が、複数のURLに分散してしまうのです。これは「重複コンテンツ問題」と呼ばれ、検索順位に悪影響を及ぼす可能性があります。例えるなら、同じ商品を近隣の複数店舗で販売することで、それぞれの店舗の売上が分散してしまうようなもんです。

301リダイレクトによる解決アプローチ

この問題を解決する最も効果的な方法が、「301リダイレクト」です。
301リダイレクトとは何でしょうか?これは「このページは恒久的に別の場所に移動しました」と宣言するHTTPステータスコードです。郵便局の転送届けのようなもので、「この住所は今後使用しません」という明確な意思表示を含みます。
検索エンジンは301ステータスコードを受け取ると、古いURLが持っていた評価をすべて新しいURLに引き継いでくれます。評価の分散を防ぎ、SEOパワーを一箇所に集約できるわけです。

実装方法の選択肢と制約

URL正規化を行う方法はいくつかあります。
最も一般的なのはWebサーバの設定ファイル(.htaccess)を使用する方法です。
しかし、運用環境によってはサーバー設定ファイルの編集が制限されているケースもあります。企業の厳格な運用ルールがあるような環境では、この方法を選択できないのです。
そこで有効な代替手段がアプリケーションレベルでの実装です。

CakePHPでの実装

今回はCakePHPフレームワークを例に、具体的な実装方法を見てみましょう。

if (isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] === '/index.php') {
    $redirectTo = 'https://' . $_SERVER['HTTP_HOST'] . '/';
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirectTo);
    exit();
}

このコードを初期化ファイルに配置すること初期段階でリダイレクト処理を実行できます。

コードの詳細解説

実装の各部分を詳しく見ていきます。

条件判定の精密設計

if (isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] === '/index.php')

この条件文は2つのチェックを組み合わせています。
まず、isset()による存在確認です。通常のWebアクセスでは$_SERVER['REQUEST_URI']は必ず存在しますが、コマンドライン実行など特殊な環境でのエラーを防ぐための安全対策です。
次に、===を用いた文字列比較をしています。これは「値と型の両方が一致するかどうか」を判定するので、/index.php/usersのような他のパスには反応しません。

転送先URLの構築

$redirectTo = 'https://' . $_SERVER['HTTP_HOST'] . '/';

ハードコーディングを避け、$_SERVER['HTTP_HOST']を使用して動的にURLを構築しています。$_SERVER['HTTP_HOST']にはアクセスされたWebサイトのドメイン名(ホスト名)が格納されています。これにより、開発環境、ステージング環境、本番環境のどこでも同じコードが適切に動作します。

HTTPヘッダの送信

header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $redirectTo);

2つのヘッダを順次送信しています。最初のヘッダで「恒久的な移動」を宣言し、検索エンジンに明確な意図を伝えます。そして、次のLocationヘッダで具体的な転送先を指示しています。

まとめ

URL正規化は、一見地味な作業に思えるかもしれませんが、SEOの観点では非常に重要な施策です。今回ご紹介したPHPによる実装手法は、サーバー設定の制約がある環境でも問題を解決できるアプローチです。
Webサイトの品質向上は、こうした細かな積み重ねから生まれます。ユーザーにとっても検索エンジンにとっても分かりやすいサイト構造を心がけていきたいものです。

参考

Htaccessリダイレクトの方法~301リダイレクトの転送方法

Discussion