wwwの有無を統一する方法(URLの正規化)

2017年3月21日

www

ホームページにwwwが付いているサイトと付いていないサイトがありますが、wwwあり・なしどちらでもアクセスできるようになっていませんか?

多くのレンタルサーバの初期設定だと、wwwあり、wwwなしどちらでもアクセスできるようになっています。

example.com
www.example.com

しかしこれでは、google等の検索エンジンのクローラーは、それぞれ別のサイトと判断してしまいます。重複コンテンツとして認識されてしまうと、正しくインデックスされるまでに時間もかかったり、SEOでペナルティを受ける可能性もあります。

いくつかあるwwwのあり・なしを統一する方法をご紹介します。

wwwありとなしはどっちがいい?

結論から言えば、ケースバイケースです。

昔ながらのサイトはwwwが付いていることが多いし、wwwから始まるURLはホームページっぽさがあります。逆に、wwwがない場合、URLが短くてスッキリして見えます。

googleやfacebookはwwwあり、twitterはwwwなしのURLになっています。

どちらでもアクセスできる方がいいけれど、リダイレクトしてどちらか一方でしかアクセスできないようにしておくのがスマートです。

301リダイレクトと302リダイレクト

よく使うリダイレクトには2種類あります。

他にもいろいろありますが、気にしなくてOKです。

301リダイレクト

301: Moved Permanently
アクセスしたURLが変更されて、新しいURLになっていることを示すリダイレクトです。ドメインの変更やWEBサイトのリニューアルによってページが移動した場合、キャンペーンサイトをクローズした後などに利用します。元のURLでアクセスして欲しくない時に使うリダイレクトなので、wwwあり・なしの統一やHTTPSでのアクセスを強制する場合などにもこちらを使います。google等の検索エンジンは元のURLは存在しなくなったと判断して、新しいURLをインデックスしようとしてくれます。

302リダイレクト

302: Found
サイトのメンテナンス中や、サイト公開前にティザーページにリダイレクトする場合などに利用します。しばらくしたらアクセスした元のURLでサイトを見れるようにするので、元のURLのままアクセスを続けてくださいという意味になります。google等の検索エンジンは元のURLは存在するURLと判断するので、インデックスが残ったままになります。

wwwあり・なしの統一方法

wwwの有無を統一する方法はたくさんありますが、それぞれメリット・デメリットがあります。

具体的な方法とともに、特徴を記載していきます。

サーバ設定での統一 apache httpd.conf

可能であればこの方法が理想です。最も高速で処理されて、サーバ負荷も下げることができます。

が、レンタルサーバなど、サーバ設定を変更できないことも多いので、中々使う機会はないと思います。

apacheでVirtualHostを使っている場合の例になります。

<VirtualHost *:80>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^satopedia\.com$
  RewriteRule ^/(.*) http://www.satopedia.com/$1 [R=301,L]
</VirtualHost>
<VirtualHost *:80>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.satopedia\.com$
  RewriteRule ^/(.*) http://satopedia.com/$1 [R=301,L]
</VirtualHost>

SSL化している場合、RewriteRuleの行のhttpをhttpsにしておいてください。

.htaccessでの統一

apache限定になりますが、.htaccessを使う方法は、比較的高速に処理されて、大体のレンタルサーバで利用できてオススメです。
ドキュメントルートに.htaccessがない場合、下記のコードを参考に、新規作成してください。

  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^(satopedia/.com)(:80)? [NC]
  RewriteRule ^(.*) http://www/.satopedia/.com/$1 [R=301,L]
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^(www/.satopedia/.com)(:80)? [NC]
  RewriteRule ^(.*) http://satopedia/.com/$1 [R=301,L]

windowsの場合、「.」始まりのファイルは作成するのが難しいので、「.」抜きでファイルを作り、FTPでアップロードした後に.htaccessという名前にリネームしてください。
WordPress等、他のプログラムが.htaccessを利用している場合は、既存のファイルに追記してください。書き込む場所は要注意です。同じような記述の中では、SSLの強制処理(HTTPSへのリダイレクト)と合わせて一番最初に書いておきたい処理です。
こちらも、SSL化している場合、RewriteRuleの行のhttpをhttpsにしておいてください。

PHPなどのプログラムでの統一

.htaccessが使えない場合等、プログラムでリダイレクトの処理を作ることも可能です。
必ず呼び出されるファイルの先頭に書いてください。このプログラムが呼び出されるより前に、画面に1文字でも出力しているとリダイレクトができません。
サーバや.htaccessでの処理よりは遅くなりますが、javascriptで処理するより遥かに高速です。

<?php
if (substr($_SERVER['SERVER_NAME'], 0, 4) !== 'www.') {
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: http://www.' . $_SERVER['SERVER_NAME']);
    exit();
}
?>
<?php
if (substr($_SERVER['SERVER_NAME'], 0, 4) === 'www.') {
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: http://' . substr($_SERVER['SERVER_NAME'], 4));
    exit();
}
?>

javascriptでの統一

稀にですが、javascriptでしか対応できない!ということもあります。基本的には推奨できない方法ですが、どうしてもという場合の対応方法になります。

<script type="text/javascript">
<!--
  if (document.domain == "satopedia.com") {
    var redirect_url = location.protocol + "//www." + location.host + location.pathname + location.search;
    location.href = redirect_url;
  }
// -->
</script>
<script type="text/javascript">
<!--
  if (document.domain == "www.satopedia.com") {
    var redirect_url = location.protocol + "//" + location.host + location.pathname + location.search;
    location.href = redirect_url;
  }
// -->
</script>

さくらインターネット利用時の注意点

詳細は割愛しますが、独自ドメインでのSSLを利用していると、サーバ側でwwwありでアクセスがあったのか、wwwなしでのアクセスなのかを判別できません。その場合、wwwあり→なしへの統一をしようとしてもリダイレクトされず、wwwなし→ありへの統一をしようとするとリダイレクトループになってしまいます。
最終的にjavascriptで対応しましたが、どうにかならないもんですかねぇ。

まとめ

wwwのあり・なしを調整することで、自分がアクセスしてもらいたいURLに誘導するだけでなく、SEO的にも有利になります。
これだけ長々と書いてきましたが、googleでのインデックスだけを気にする場合、Search Consoleで設定してしまえば、googleは正しく処理してくれます。

WEBApache

Posted by さとし