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 /
書き換えの基準となる URL を設定します。ドキュメントルートに設置する場合は省略しても構いません。
RewriteCond %{REQUEST_URI} ^.*/index.html$
書き換えを行う条件を定義します。この例は、 URL のホスト名より後ろ(ファイル名とディレクトリ名の部分) %{REQUEST_URI}/index.html で終わる場合に次のルールを適用するということを表しています。
RewriteRule ^(.*)index.html$ http://s1.adam.ne.jp$1 [R=301,L]
書き換えのルールを定義します。この例は、上の条件にあてはまるあらゆるリクエスト ^(.*)index.html$http://www.example.com/$1 にリダイレクトするということを表しています。$1^(.*)index.html$ の括弧で囲まれた部分を表す変数です。[R=301] は HTTP ステータスコード 301 を返してリダイレクトすることを表すフラグです。[L] は書き換えプロセスの終了を表すフラグです。

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

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

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 ファイルに次のように記述します。

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

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

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

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

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

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

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