URLの正規化(mod_rewriteによるリダイレクト)

URLの正規化とは

同一のウェブサイトを表示するためのURLが複数存在することがあります。例えば下記の URL にアクセスした時にすべて同じウェブサイトが表示されるとします。

  • http://www.example.com/
  • http://www.example.com/index.html
  • http://example.com/
  • http://WWW.EXAMPLE.COM/
  • https://www.example.com/
  • http://username.adam.ne.jp/

これらのURLを1つに統一するのが正規化です。URLの正規化を行うとSEO効果が高まるといわれています。

mod_rewriteを使用したURLの正規化

A index.htmlのありなしを統一する

URLが /index.html で終わるリクエストがあった時に index.html を省略するには.htaccessファイルに次のように記述します。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^.*/index\.html$
RewriteRule ^(.*)index.html$ http://www.example.com/$1 [R=301,L]

RewriteEngine on
書き換えエンジンを有効化します。
RewriteBase /
書き換えの基準となるURLを / に設定します。このディレクティブを省略した場合.htaccessファイルを設置したディレクトリが基準となります。
RewriteCond %{REQUEST_URI} ^.*/index\.html$
書き換えを行う条件を定義します。この例は、%{REQUEST_URI} (URLのドメイン名より後ろの部分を表す変数)が /index.html で終わる場合に次のルールを適用するということを表しています。
RewriteRule ^(.*)index.html$ http://www.example.com/$1 [R=301,L]
書き換えのルールを定義します。この例は、上の条件にあてはまるリクエスト ^(.*)index.html$http://www.example.com/$1 に書き換えることを表しています。$1^(.*)index.html$ の括弧で囲まれた部分を表す変数です。[R=301] はHTTPステータスコード301を返してリダイレクトすることを表すフラグです。[L] は書き換えプロセスの終了を表すフラグです。この2つのフラグをまとめて [R=301,L] と記述します。

B wwwのありなしを統一する

wwwなしのURLにアクセスがあった時にwwwありのURLにリダイレクトするには.htaccessファイルに次のように記述します。

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule .* http://www.example.com%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTP_HOST} ^example\.com$
書き換えを行う条件を定義します。この例は、%{HTTP_HOST} (URLのホスト名を表す変数)が example.com と一致した場合に次のルールを適用するということを表しています。[NC] は大文字と小文字を区別しないことを表すフラグです。
RewriteRule .* http://www.example.com%{REQUEST_URI} [R=301,L]
書き換えのルールを定義します。この例は、上の条件にあてはまるリクエスト .*http://www.example.com%{REQUEST_URI} に書き換えることを表しています。%{REQUEST_URI} はリクエストされたURLのドメイン名より後ろを表す変数です。この変数を使用することによってトップページ以外へのアクセスに対応しています。

wwwありのURLにアクセスがあった時にwwwなしのURLにリダイレクトするには.htaccessファイルに次のように記述します。

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule .* http://example.com%{REQUEST_URI} [R=301,L]

C 異なるホストへリダイレクトする

提供ドメインのURLにアクセスがあった時に独自ドメインのURLにリダイレクトするには.htaccessファイルに次のように記述します。

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^username\.adam\.ne\.jp$ [NC]
RewriteRule .* http://www.example.com%{REQUEST_URI} [R=301,L]

D SSLのありなしを統一する

SSLなしのURL(http://www.example.com/)にアクセスがあった時にSSLありのURL(https://www.example.com/)にリダイレクトするには.htaccessファイルに次のように記述します。

RewriteEngine on
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule .* https://www.example.com%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} off
書き換えを行う条件を定義します。この例は、HTTPSが無効の場合に次のルールを適用するということを表しています。

ABCD を合わせて記述する

A〜D を合わせて記述すると次のようになります。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^.*/index\.html$
RewriteRule ^(.*)index.html$ https://www.example.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^example\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^username\.adam\.ne\.jp$ [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule .* https://www.example.com%{REQUEST_URI} [R=301,L]

[OR] は複数の条件を OR でつなぐフラグです。いずれかの条件に一致した場合を表します。[OR] がなければ AND でつないだことになり、すべての条件に一致した場合を表します。