PR
Cocoon

URLの正規化とは?HTTP→HTTPSやwwwの有無など基本パターンを解説

この記事は約5分で読めます。

URL 正規化とは?

ひとつのページに複数の書き方があると、検索エンジンは「どれが正式な URL か」を判断できず、評価が分散します。

このURL を 1 種類に統一する作業が正規化です。

正規化を行うときは.htaccessを編集します。
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]

ポイント: HTTPSoff のときだけ転送。
恒久転送は 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 を使えば
プロトコルサブドメイン
末尾スラッシュクエリ文字列 まで
柔軟に統一できます。