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$
書き換えを行う条件を定義します。この例は、URLのホスト名より後ろの部分 %{REQUEST_URI}/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$ [NC]
書き換えを行う条件を定義します。この例は、URLのホスト名 %{HTTP_HOST}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}off の場合に次のルールを適用するということを表しています。

(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 でつないだことになり、すべての条件に一致した場合を表します。