重複したURLを正規のURLに統合した。
更新日: 2021-10-06 18:34:11
canonical タグで正規のURLを指定しているものの、site:コマンドを見てみると、正規ではない形式のURLが3割ほど混じっていた。正規ではない形式のURL とは、wwwの有り無しや、SSL化しているにも関わらず http:// ~ 形式のURL などだ。
なお、 301リダイレクトは行っていない。
canonical タグで正規のURLを指定するだけでも、うまく処理してくれるはずだが、正規ではないURLにアクセスできたり、検索結果に表示されるのは、なんだか気持ちが悪い。
- 現在の状況 (2021/07/24 現在)
- [問題] site:コマンドを打ってみると、3割の URL が指定したとおりに処理されていないようだ。
- [問題] トップページが、https://example.com/ を指定しているのに、http://www.example.com/ が表示されている。
- なぜそうなるのか?の推測
- 別々のURLと判断されるパターンを確認しておく。
- ディレクトリ末尾のスラッシュ( / )のありなしは、別々の URL と見なされる。
- www のありなしも、別々の URL と見なされる。
- http https も、別々に扱っているようだ。
- index.php や index.html のありなし
- ただし、トップページに限っては、末尾のスラッシュ( / )のありなしは、同じ URL として処理されるようだ。
- トップページ末尾のスラッシュ( / )のありなしについて、主要サイトではどう処理されているか?
- 重複したURLをこのままにしておくとどうなるのか?
- google が推奨する方法
- 301リダイレクトで正規URLに統合する方法。
- 301リダイレクトを設定した後、どうなったか?
- エラー 0 → 0
- 有効(警告あり) 0 → 0
- 有効 113 → 100
- 除外 72 → 49
- site:ドメイン名での検索結果数
- まとめ
現在の状況 (2021/07/24 現在)
- 以下の違いについて、どちらにアクセスしても HTTP 200 OK でアクセス可能になっている。
http:// , https://
wwwあり , wwwなし
example.com/index.php , example.com/ , example.com - 内部リンクは / から始まる絶対パスで記述している。
- www付きや、http://からはじまる内部リンクは一切ない。
- また、新規ドメインなので、外部リンクもないはず。
- リダイレクト処理による正規のURLへの統合はしていない。
- サイト開設時から canonicalタグにて正規のURLを指定している。
- 全て https:// から始まる wwwなし の絶対URLで記述。
<link rel="canonical" href="https://example.com/ ~ ">
- 全て https:// から始まる wwwなし の絶対URLで記述。
- google には正規化した URL が記述されたサイトマップを送信している。
[問題] site:コマンドを打ってみると、3割の URL が指定したとおりに処理されていないようだ。
site:コマンドの結果より、どの形式で登録されているかの内訳
- https ://example.com/ ------- 43 (正しい形式)
- http ://example.com/ --------- 6
- http :// www .example.com/ --- 1
- https :// www .example.com/ - 10
上記について、サーチコンソールで調べてみると、どうやら、http:// や www付きのURLを先にクロールしたが、その時点で、正規のURL はまだ未クロールになっていた。つまり、正規のURL がないので、とりあえず http:// や www付きのURL を表示しているのだろうか?だとすれば、そのまま放置しておけば、いずれ解消するかもしれない。これは、不具合ではなく、処理途中ということか。
[問題] トップページが、https://example.com/ を指定しているのに、http://www.example.com/ が表示されている。
サーチコンソールで各パターンのトップページのURLを入力し、そのURLに対する「Google が選択した正規 URL」を調べてみると、
- https :// www .example.com/ → 正規のURLを認識している(OK)
- http :// www .example.com/ → http://www.example.com/ を正規のURLと認識しているようだ。( ダメ )
- http ://example.com/ → 正規のURLを認識している(OK)
- https: //example.com/ → 正規のURLを認識している(OK)
なぜそうなるのか?の推測
googleは、テスト的に www付きや、http:// というパターンでのアクセスを試みているのかもしれない。
googleがページを発見する仕組み
googleのクローラーはあるページを取得すると、そのページ内のリンクを取得することで、次々に新たなページを見つけ出していくという仕組みになっている。
なので、何らかの理由で www付きや、http:// というページがクロールされてしまうと、そのページ内で新たに発見するリンクは、www付きや、http:// という形式のURL になってしまう。(http ~ から記述する 絶対パス であればそういった問題は発生しないかもしれないが)
つまり、 新たなページを追加すればするほど、正規ではないURL がクロール候補としてどんどん増えていってしまう。
別々のURLと判断されるパターンを確認しておく。
ディレクトリ末尾のスラッシュ( / )のありなしは、別々の URL と見なされる。
https://developers.google.com/search/docs/beginner/seo-starter-guide?hl=ja
上記ページによると、パスとファイル名については、末尾のスラッシュによって別々の URL と見なされる。
example.com/cat
example.com/cat/
www のありなしも、別々の URL と見なされる。
example.com
www.example.com
http https も、別々に扱っているようだ。
http https は区別するかどうかは 上記ページには書かれていなかった。
http://example.com/
https://example.com/ ※googleでは、httpsを推奨
しかし、以下のページを見ると、http https は別々に扱っているようだ。
https://developers.google.com/search/docs/advanced/crawling/consolidate-duplicate-urls?hl=ja
index.php や index.html のありなし
それ以外にも、example.com/index.php , example.com/ も統一しておいた方が良さそう。
ただし、トップページに限っては、末尾のスラッシュ( / )のありなしは、同じ URL として処理されるようだ。
https://example.com
https://example.com/
https://developers.google.com/search/docs/beginner/seo-starter-guide?hl=ja
上記ページによると、「ホームページを参照する場合、ホスト名の後ろにある末尾のスラッシュは省略可能です。スラッシュの有無にかかわらず同じコンテンツに導かれるためです」とある。
また、「正規化して統一するように」とは特に書かれていなかった。特に何もしなくてもよさそう。
試しに、サーチコンソールの URL検査で、https://example.com と入力すると、https://example.com/ と、スラッシュが自動で付与された。少なくても サーチコンソール内でのトップページは、末尾のスラッシュ( / )は「あり」で統一して処理しているようだ。
https://www.suzukikenichi.com/blog/differences-between-trailing-slash-and-non-trailing-slash/
上記ページでも、「両者の違いを僕たちは気にする必要はありません。」と解説されている。
トップページ末尾のスラッシュ( / )のありなしについて、主要サイトではどう処理されているか?
以下のURLを末尾のスラッシュ( / )なしとありでアクセスしたところ、どちらもリダイレクトされる事なく、全て HTTP 200 OK ステータスが返って来た。そして、canonical の URL は、全てのサイトの末尾のスラッシュなしとありのどちらにアクセスしても「末尾のスラッシュ( / )が、有り」で記述されていた。(2021/07/23現在)
https://www.youtube.com/
https://www.nicovideo.jp/
https://www.yahoo.co.jp/
https://www.pixiv.net/
https://twitter.com/
https://www.amazon.co.jp/
https://www.rakuten.co.jp/
https://kakaku.com/
https://www.instagram.com/
https://qiita.com/
トップページの末尾のスラッシュ( / )があるかないかの扱いについては、canonical タグで正規URLを指定しておくだけで、リダイレクトはしなくても大丈夫そう。
重複したURLをこのままにしておくとどうなるのか?
canonical タグで正規のURLを指定していれば、googleの説明どおり、時間と共に正規として指定したURLに評価が統一されていくはずだ。(絶対にそうなるとは限らないが、googleに対して指示を送れる)。すると、そのうちに、正規ではないURLへのクロール頻度は下がるだろう。
とはいえ、正規ではないURLは存在しているので、確認の為にたまにはクロールが来るかもしれない。大量の正規ではないURLが増加していき、かつ、一時的かもしれないが、タイミングによってインデックスされてしまうのは、なんだか気分がスッキリしない。
google が推奨する方法
https://developers.google.com/search/docs/advanced/crawling/consolidate-duplicate-urls?hl=ja
上記によると、以下の方法を使用するようにと書かれている。また、それぞれのメリット・デメリットも書かれている。なお、何もしない場合は、google側の判断で正規のURLが決められる。
- head 内に canonical タグを設置し、正規のURLを指定する。
- ページのヘッダーで canonical(正規のURL)を送信する。
- google にサイトマップを送信する。
- 301 リダイレクトする。
- ページの AMP バージョン
301リダイレクトで正規URLに統合する処理を追加するのが良さそう。
301リダイレクトとは?
301リダイレクトを設定すると、そのページにアクセスしても、「ページが永久に移転しました」という意味のヘッダー(通知みたいなもの)がブラウザやクロールに通知され、移転先のページへ強制的に転送される。(移転元にはアクセスできない)
移転元のURL自体は、一定期間google内部に残るのだろうが、移転した為にもう存在しないのだから、移転先のURLに上書きされていくはずだ。また、移転元のURLにはアクセスできなくなるので、上述のように、正規ではないページをクロールし、そこから正規でないURLを拾い集めることを防止できる。
以下のページには、「301 リダイレクトを使って、指定した URL よりもリダイレクト先の URL のほうが優れたバージョンであることを Googlebot に伝えます。この方法は、重複ページを廃止するときにのみ使用します。」と書かれている。
https://developers.google.com/search/docs/advanced/crawling/consolidate-duplicate-urls?hl=ja
301リダイレクトで正規URLに統合する方法。
.htaccess ファイルに以下の記述を追記した。
書き換え機能を ON にする記述
RewriteEngine On
クエリが空の時のみ、サイト内全てのURLにおいて、末尾の index.html (又は index.php) をなし に統一する。
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(.*)index\.(html|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
wwwなし に統一する。
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
https に統一する。
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
301リダイレクトを設定した後、どうなったか?
301 リダイレクトを設定した直後である 2021/07/26 ~ 2021/10/05 までの 71日間 の変化
数値は、サーチコンソール内のカバレッジより
エラー 0 → 0
変化なし
有効(警告あり) 0 → 0
変化なし
有効 113 → 100
内訳
- 送信して登録されました。
82 → 0 (全て正規のURL) - インデックス登録されましたが、サイトマップに送信していません。
31 (うち、正規ではないURL: 30 )
↓
100 (うち、正規ではないURL: 14 )
つまり、正規のURLが 83 から 86 になったということ。
除外 72 → 49
内訳
- 検出 - インデックス未登録
56 → 0
(全て正規のURL。前回のクロールが該当なしになっている。URLの存在は確認しているが、まだクロールしていないってこと?) - 代替ページ(適切な canonical タグあり)
15 → 21
(全て正規ではないURL) - クロール済み - インデックス未登録
1 (うち、正規でないURL: 0 )
↓
21 (うち、正規でないURL: 6 ) - ページにリダイレクトがあります
0 → 7
(全て正規でないURL)
site:ドメイン名での検索結果数
52 (うち、正規のURL: 32 ) ※1
↓
54 (うち、正規のURL: 50 ) ※2
※1「似たページを除外して、検索結果をすべて表示する」だと、 57
※2 「似たページを除外して、検索結果をすべて表示する」へのリンクは無かった
まとめ
canonicalタグだけでも正しく指定してあれば問題は起きないと思うが、一時的?に正規ではないURLが検索結果に表示されたり、サーチコンソールにも表示される事がある。
正規ではないURLは、いずれ正規のURLに統合されるかもしれないが、なんだか気持ちが悪いし、本当に統合されるかもわからない。(統合処理にかかる時間はサイトによって違うかも?)
その場合は、 301リダイレクト で重複URLを強制的に統合すればよい。
301リダイレクトを行えば、リダイレクト前のURLにアクセスしても強制的に正規のURLに転送されるので、リダイレクト前のページソースが取得される事もないし、登録される事もない。