Rewish

PHPでwww有りと無しのURLを統一する

例えば、http://www.example.com/ と http://example.com/ の内容が同じ場合、SEO的に見ればこれらはどちらかに統一されるべきです。

統一する方法として最もポピュラーなのは、Apacheのmod_rewriteを使用した統一方法だと思いますが、今回はmod_rewriteが使用できない環境且つPHPが使用できる環境での統一方法を紹介します。

ソースコード

www有りに統一

<?php
/**
 * www無しはリダイレクト
 */
if (strpos($_SERVER['HTTP_HOST'], 'www.') !== 0) {
  $url = 'http://www.' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
  header("Location: $url", true, 301);
  exit(0);
}

www無しに統一

<?php
/**
 * www有りはリダイレクト
 */
if (strpos($_SERVER['HTTP_HOST'], 'www.') === 0) {
  $url = 'http://' . substr($_SERVER['HTTP_HOST'], 4) . $_SERVER['REQUEST_URI'];
  header("Location: $url", true, 301);
  exit(0);
}

説明

まずstrpos()を使ってホスト名の先頭に www. があるかどうかチェックします。strpos()は最初に見つかった位置を返すので、0と比較すれば www. の有無を判定できます。

次にheader()でLocationヘッダを指定してリダイレクト。header()でそのままリダイレクトするとステータスコード302(一時的移動)を返すので、ステータスコード301(恒久的移動)を返すように設定する。

www無しで統一するコードではsubstr()を使って先頭4文字を削ります。 www. なので4文字。

最後にLocationヘッダを使用して統一するURLへリダイレクト。この時、ホスト名のみでリダイレクトするとドメインルートに移動してしまうので、REQUEST_URIをホスト名の後に付加してあげる。

まとめ

  • strpos()www. があるかないか調べる
  • ステータスコード301じゃないと本末転倒
  • Location:ヘッダでリダイレクト
  • REQUEST_URIも付けるとGooooood