URL 正規化とは?
ひとつのページに複数の書き方があると、検索エンジンは「どれが正式な URL か」を判断できず、評価が分散します。
このURL を 1 種類に統一する作業が正規化です。
https://kaiwach.net/archives/545
.htaccess で行う主な正規化パターン
書き方のコツ
① RewriteEngine On
は 1 回だけ先頭に記述。
② 「大きい変換」→「細かい変換」の順に並べ、
無限ループを防ぎましょう。
http → https(常時 SSL 化)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
ポイント: HTTPS
が off
のときだけ転送。
恒久転送は 301
を使用します。
www あり/なしを統一
● www なし → あり
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
www あり → なし
RewriteCond %{HTTP_HOST} ^www\.(.+)$
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
既存リンクが多い形式へそろえると 404 リスクを抑えられます。
末尾スラッシュの有無を統一
末尾のスラッシュはトレイリングスラッシュと呼ばれます。
スラッシュを付けたい場合
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1/ [R=301,L]
スラッシュを外したい場合
RewriteRule ^(.+)/$ https://%{HTTP_HOST}/$1 [R=301,L]
-f
や -d
で実ファイル/ディレクトリを除外し、
誤転送を防ぎます。
index.html / index.php を隠す
RewriteCond %{THE_REQUEST} \s/+(.*/)?index\.(php|html)\s
RewriteRule ^ %1 [R=301,L] # 表示はファイル名なしへ
RewriteRule ^$ index.php [L] # 内部的に読み込む
ユーザーにはファイル名を見せず、サーバー内部で処理します。
URL をすべて小文字にする
RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^ ${lowercase:%{REQUEST_URI}} [R=301,L]
注意: RewriteMap
は
サーバー本体(httpd.conf
)側の設定が必要です。
共有サーバーでは使えない場合があります。
不要なクエリ文字列を削除
例:?ref=abc
だけを除去
RewriteCond %{QUERY_STRING} (^|&)ref=[^&]+(&|$)
RewriteRule ^ %{REQUEST_URI}? [R=301,L]
最小構成テンプレート
RewriteEngine On
# 1) http → https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# 2) www なし → www あり
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
# 3) index.php 削除
RewriteCond %{THE_REQUEST} \s/+(.*/)?index\.php\s
RewriteRule ^ %1 [R=301,L]
# 4) 末尾スラッシュを付ける
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1/ [R=301,L]
よくある Q&A
質問 | 回答 |
---|---|
302 と 301 の違いは? | 302 は「一時転送」。検索エンジンは元 URL を保持する場合があります。恒久的に変更するなら 301 を使用します。 |
ルールが循環してエラーになる | [L] がない、順序が逆などで再読み込みが止まらないと発生。1 ルールずつ動作を確認しましょう。 |
旧 URL が大量にある | 個別に Redirect 301 /old-path /new-path を並べても可。件数が多い場合は CSV → スクリプトで一括生成すると便利です。 |
まとめ
URL 正規化のゴールは「1 ページ = 1 URL」。
.htaccess
を使えば
プロトコル・サブドメイン・
末尾スラッシュ・クエリ文字列 まで
柔軟に統一できます。