エンジニアのためのSEO入門

ApacheのURLリダイレクト設定 | RewriteRuleサンプル付

Apacheウェブサーバーでmod_rewriteによる正規表現を使用したURLのリダイレクト/リライト(書き換え)設定を紹介します。RewriteRuleのサンプルコードもURLの正規化やディレクトリの移動、ブログ記事パラメータの擬似静的化など、さまざまなシーン別にご用意しましたので、参考にしてください。

スキルセットや共通言語が異なる
エンジニアとWeb担当者をつなぐための手引書

エンジニアのためのSEO入門

これまで3回に分けて、「URLの最適化」について解説してきました。URL設計時の基本となる永続化の考え方、また被リンクが分散してしまった場合の正規化、そして動的なURLでもしっかりとインデックスしてもらうための静的化(擬似静的化)の手法などです。

URLの最適化3つの方法

いずれもクローラビリティを向上させ、サイトのコンテンツを適切にインデックスしてもらうことが目的ですが、その際にはサーバーの設定を変更する必要があります。今回は、Apacheの代表的なモジュールである「mod_rewrite」のサンプルコードをいくつか紹介していきます。

※このサンプルはいずれも、サイトのルートディレクトリに置いた.htaccessでリライト設定をする場合のものとなっています。

URLの擬似静的化の実例

まずは、前回記事のおさらいも兼ねてシステムで動的に生成されるインデックスページのURLを擬似静的化する場合のサンプルをご紹介します。

たとえば、あるサイトでエリアを指定して結果を表示する場合「mod_rewrite」では、カテゴリのURLを以下のように擬似静的化しているはずです。

東京都港区のレストランを一覧表示するページのURL
  • 擬似静的化されたURL
    /area/kanto-13-minato/
  • サンプルコード
    RewriteRule ^area/(.*)-(.*)-(.*)/$ /area.php?area1=$1&area2=$2&area3=$3&sort=2 [L]
表示部分はarea.phpで生成、以下の4つのパラメータを必要とする。
パラメータ名パラメータ値値の説明
area1kanto関東(地域)
area213東京(都道府県)
area3minato港区(市区町村)
sort2人気順(並び順、1が新着順、2が人気順など)

「area1=kanto」「area2=13」「area3=minato」というパラメータ値がarea.phpへ渡ります。擬似静的化されたURLには、sortの値(並び順を示す情報)が含まれていませんが、固定値を渡すことで初期の並び順を指定することもできます。

またRewriteCondディレクティブを加えることで、特定条件のときだけ処理をすることができます(「HTTP_USER_AGENT」や「REMOTE_ADDR」で携帯電話からのアクセスを振り分け、「HTTP_REFERER」でダイレクトアクセスを禁止。「QUERY_STRING」をプログラムへ渡して処理するなど)。

実際に試してみよう

「mod_rewrite」や「ISAPI_Rewrite」の評価や検証をしてみたい場合は、簡単に自分のパソコンで試すことができます。

「mod_rewrite」であれば、「xampp」というフリーソフトがあります。Windows上でApacheやMysqlを同時にインストールしてくれる便利なソフトです。これをインストールすると、Apacheの下にhttpd.confファイルが作成されます。ローカル環境で、実際にルートディレクトリに.htaccessファイルを作り「mod_rewrite」の挙動を確認してみてください。

「ISAPI_Rewrite」は、お使いのパソコンにIISがインストールされていれば、そのまま利用することが可能です。また、マイクロソフトのIISに関するページから、「Windows Server 2003 R2」の評価版をダウンロードすることもできます。

SEOに効くリダイレクト/リライト設定サンプル集

前回の解説内で、SEOのためのURLの擬似静的化に関しては正規表現を完全に把握していなくても設定できるとお話してきました。ここでは、SEOの観点でリダイレクト/リライトを行う際によく利用されるサンプルコードを簡単な解説付きで説明しています。こんな場合はどうすればいいの? シーン別の対策例を一挙にご紹介します。

※サンプルコードはすべて「mod_rewrite」の例を紹介しています。
サンプルリスト
  1. ドメイン名を変更したい
  2. 「www」の有無を統一したい
  3. トップページのURLを「/index.html」ではなく「/」に統一したい
  4. 特集ページなどをディレクトリ単位で移動したい
  5. 新規投稿記事に付加されてしまうパラメータを消したい

ドメイン名を変更したい

  • 仕様
    http://www.example.com/○○○ ⇒ http://www.example.co.jp/○○○
    ドメイン名以下のURLはすべて同じ構成で、ドメイン名だけを変更する。その際には301リダイレクトさせる。
  • サンプルコード
    RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
    RewriteRule ^(.*)$ http://www.example.co.jp/$1 [R=301,L]

ドメイン名の変更があった場合、SEO的にはURLを擬似静的化させる前にサイト全体をリダイレクトさせる必要があるため、上記のように設定します。同一サーバーで複数のドメインを構成している場合は、古いドメインのみ反応するように、RewriteCondで指定します。RewriteRuleに「R=301」を付加することで新しいドメイン名へリダイレクトがかかります。

「www」の有無を統一したい

  • 仕様
    http://example.com/ ⇒ http://www.example.com/
    wwwなしでアクセスがあったら、wwwありに301リダイレクトさせる
  • サンプルコード
    RewriteCond %{HTTP_HOST} ^example\.com [NC]
    RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

URLの正規化の記事で説明したとおり、URLはwwwあり、もしくはwwwなしのどちらかに統一する必要があります。もし検索エンジンに両方認識されてしまった場合には上記のように設定します。

トップページのURLを「/index.html」ではなく「/」に統一したい

  • 仕様
    http://example.com/index.html ⇒ http://www.example.com/
    「/index.html」でアクセスがあったら、「/」に301リダイレクトさせる
  • サンプルコード
    RewriteRule ^index.html$ http://www.example.com/ [R=301,L]

こちらもURLの正規化で説明したケースです。検索エンジンに「/index.html」のURLがインデックスされている以上、301リダイレクトを行います。Apache2.x系のみ動作するため注意が必要です。

特集ページなどをディレクトリ単位で移動したい

  • 仕様
    http://example.com/special/* ⇒ http://example.com/s/*
  • サンプルコード
    RewriteRule ^special/(.*)$ /s/$1 [L]

あるディレクトリを同一ドメイン名の別のディレクトリへ引越しする必要がある場合です。検索エンジンにインデックスされているのであれば、URLの永続化の観点からリライトで対応することも可能です。「(.*)」で、special以下のすべての条件に一致させ、「$1」で後方参照します。これはリライト条件なので、301リダイレクトは設定しません。

ブログ記事に付けられる番号パラメータのURLを静的URLでアクセスできるようにしたい

  • 仕様
    http://example.com/post/{記事番号}/ ⇒ http://example.com/post.php?no={記事番号}
  • サンプルコード
    RewriteRule ^post/(.*)/$ /post.php?no=$1 [L]

ブログやCMSなど、記事を投稿するごとに番号が振られるシステムを利用している場合の、記事ページに自動的に付加されるパラメータを擬似静的化します。見た目は静的なURLですが、裏ではpost.phpというプログラムにパラメータを渡して処理しています。

◇◇◇

いかがだったでしょうか。エンジニアであれば正規表現をうまく活用して、適切な処理を心がけたいものです。

用語集
Apache / CMS / IIS / SE / SEO / mod_rewrite / インデックス / エンジニア / クローラビリティ / ダウンロード / ディレクトリ / ドメイン名 / 検索エンジン / 被リンク
この記事が役に立ったらシェア!
メルマガの登録はこちら Web担当者に役立つ情報をサクッとゲット!

人気記事トップ10(過去7日間)

今日の用語

Python
「Python」(パイソン)は、プログラミング言語の1つ。プログラマのグイド・ヴ ...→用語集へ

インフォメーション

RSSフィード


Web担を応援して支えてくださっている企業さま [各サービス/製品の紹介はこちらから]