URLの正規化

複数のURLで同じページが表示されたり、複数の似た内容のページがある時、利用するURLを統一することができます。

本ページでは、URLの正規化について説明します。

URLの正規化とは

URLの正規化は、主に以下の目的で行います。

複数のURLで同じページが表示される時
URLがAでもBでも、同じページが表示される時、URLのAだけが使われるように統一する。 URL:AでもURL:Bでも、同じページが表示される例
似た内容の複数のページがある時
ページAとBが似た内容の時、1つのページ(URL)を正規ページとする。 白い靴のページと、赤い靴のページがある時、赤い靴のページを正規ページとする。

次からは、それぞれのパターンについて、以下の順に説明します。

  1. 複数のURLで同じページが表示される時の正規化
  2. 似た内容の複数のページがある時の正規化

複数のURLで同じページが表示される時の正規化

例えば、https://example.com/と指定しても、https://example.com/index.htmlと指定しても、同じページが表示されるとします。このままでは、同じページなのにURLが違うため、異なる2つのページがあるように見えてしまいます。

https://example.com/と指定しても、https://example.com/index.htmlと指定しても、同じhttps://example.com/index.htmlが表示されます。URLが違うため、異なるページとして扱われる可能性があります。

このため、1つのページに見えるようにURLをhttps://example.com/に正規化できます。このように正規化すると、以下の動作をします。

  1. ブラウザでhttps://example.com/index.htmlと指定すると、https://example.com/に転送されます。
  2. https://example.com/は、https://example.com/index.htmlのページを表示します。

結果として、https://example.com/index.htmlのページが表示されるのですが、ブラウザのアドレス欄にはhttps://example.com/と表示されます。また、検索エンジンなどでも1つのページ(https://example.com/)と認識されます。

URL正規化のメリット

URL正規化によって、以下のメリットがあります。

ブラウザのアドレス欄に表示されるURLが統一される
同じページなのに、ブラウザのアドレス欄に違うURLで表示されることを防げます。
被リンクが2つのURLに分散されない
他サイトから異なるURLでリンクされると、検索エンジンのページ評価が分散されます。分散されると、ページの順位に悪影響が出ます。URLを統一することで、ページ評価が分散されません。
検索結果に同じページが表示されることを防げる
検索サイトで検索した時、正規化されていない場合は同じページが結果に表示される可能性があります。URLを統一することで、同じページは表示されなくなります。

ソーシャルボタンでのカウントが統一される
いいねなどのソーシャルボタンは、異なるURLの場合は別々にカウントする可能性があります。URLを統一することで、別々にカウントされなくなります。

検索エンジンは、URLが異なっても同じページを可能な限り検知しますが、検知できない場合もあるため正規化した方が安心です。

URLの正規化例

以下は、異なるURLで同じページが表示されます。

【異なるURLで同じページが表示される例】
正規化前のURL 表示されるページ
https://example.com https://example.com/index.html
https://example.com/
https://example.com/index.html
https://www.example.com/
http://example.com/
https://example.com/test https://example.com/test/index.html
https://example.com/test/
https://example.com/test/index.html
https://www.example.com/test/
http://example.com/test/

上記の表示されるページは、以下のように正規化できます。

【URLの正規化例】
表示されるページ 正規化後のURL
https://example.com/index.html https://example.com/
https://example.com/test/index.html https://example.com/test/

以下のように、wwwあり/なしのどちらでも表示できる場合は、どちらかで正規化することになります。

  • https://www.example.com/
  • https://example.com/

上の例では、https://example.com/に正規化していますが、https://www.example.com/に正規化することもできます。

.htaccessを利用した正規化

URLの正規化は、.htaccessを利用して行います。以下は、先に説明した正規化を実現する時の記述例です。

【URL正規化のための.htaccess記述例】
RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule ^(.*) https://example.com/$1 [R=301,L]

RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ https://example.com/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

バックスラッシュ(\)が見つからない時は、円マーク(\)で記述しても同じです。

上記をメモ帳などで作成して、ファイル名を.htaccessにして保存します。保存したファイルを、サーバーのトップディレクトリ(トップページと同じディレクトリ)にアップロードします。上記は、ドメイン名がexample.comの場合の例なので、自身のドメイン名に合わせて修正が必要です。

上記により、以下の動作になります。

赤字:wwwなしで正規化
http(s)://www.example.com/にアクセスがあると、https://example.com/に転送します。(.*)は、任意の文字列を$1に代入します。このため、サブディレクトリ含めたすべてのページに有効で、http(s)://www.example.com/test/にアクセスがあった場合も、https://example.com/test/に転送されます。
青字:index.htmlなしで正規化
http(s)://example.com/index.htmlにアクセスがあると、https://example.com/に転送します。これも、サブディレクトリにも有効で、http(s)://example.com/test/index.htmlにアクセスがあると、https://example.com/test/に転送します。
緑字:HTTPSに正規化
HTTPでアクセスがあった場合、HTTPSでの通信に切り替えます。これも、サブディレクトリ含めてどのページにアクセスがあっても、HTTPSに切り替えられます。

もし、wwwありで正規化したい場合、赤字部分は以下のように記述します。

【wwwありで正規化する時の.htaccess記述例】
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*) https://www.example.com/$1 [R=301,L]

繰り返しになりますが、正規化してもしなくても、結果としては同じページが表示されます。しかし、正規化することでブラウザのアドレス欄には、転送先の正規化したURLだけが表示されます。

また、この転送は301リダイレクトと呼ばれ、転送するだけでなくページ自体の移転を意味します。このため、検索エンジンは移転先のURLに統一されたことを認識できます。

トレイリングスラッシュ

https://example.com/test/と、https://example.com/testの2種類のURL指定方法がありました。最後のスラッシュ(/)がある、ないで違います。この最後のスラッシュは、トレイリングスラッシュと呼ばれます。

この2種類のURLの違いは、以下のとおりです。

https://example.com/test/
testというディレクトリを示します。通常は、test/index.htmlファイルなどが表示されます。
https://example.com/test
testというファイルを示します。ただし、ファイルがないと一般的にtest/と同じファイルを表示します。

通常は、上記のとおり動作しますが、サーバーの設定によってはディレクトリにあるファイル一覧が表示されることもあります。念のため、上記のとおり表示されることを確認しておく必要があります。

また、https://example.com/と記述した時も、トレイリングスラッシュが使われていることになります。上記の観点から、こちらの記述の方が正確です。ただし、https://example.comというファイルはないので、https://example.com/と結果的には同じ意味になります。

なお、ブラウザではアドレス欄でトレイリングスラッシュを省略して表示することがあります。アドレス欄に表示されたURLをコピーしてメモ帳に貼り付けると、トレイリングスラッシュがあることが確認できます。

似た内容の複数のページがある時の正規化

似た内容の複数のページがある時、代表的なページを正規ページとすることもあります。

例えば、同じ製品で赤と白で色違いのページがある場合、2つのページに評価が分散されて、どちらのページも検索結果で上位表示されない可能性があります。この対策として、赤のページを優先して検索結果に表示するといった正規化を行います。

白の靴のページと、赤の靴のページがある時、赤の靴のページを優先させると、検索結果には赤の靴のページが表示される。

この時、.htaccessで白のページから赤のページに転送すると、白の製品が見れなくなってしまいます。このため、転送しない方法として、rel="canonical"を使って正規化します。

【rel="canonical"を使った正規化例】
<link rel="canonical" href="https://example.com/red.html"/>

優先ページは、相対パスではなく、絶対パスでの記述が推奨されています。

上記を白のページで、head要素内に記述します。そうすると、red.htmlページ(赤のページ)に正規化されて、Googleなどで検索した時に赤のページだけが表示されるようになります。また、白のページへの評価も赤のページに渡されて、赤のページの上位表示が期待できます。

.htaccessと違って、引き続き白のページも参照可能です。つまり、赤のページから白のページにリンクしておけば、どちらのページも見てもらえます。

補足

https://example.com/page.html?a=1などのURLが使われることもあります。これが、https://example.com/page.htmlと同じページである場合も正規化することがあります。ただし、URLの最後にあるパラメタのa=1が重要な場合もあります。

この時は、リダイレクトによってhttps://example.com/page.htmlに転送するとパラメタがなくなってしまうため、canonicalを使った方法で正規化します。

この正規化によって、検索エンジンではhttps://example.com/page.htmlが優先されますが、ブラウザではhttps://example.com/page.html?a=1のまま転送されずにアクセスも可能になります。