JS挿入してクライアントサイドでレンダリングしたcanonicalタグをGoogleは実際にはきちんと処理することが判明

[レベル: 上級]

JavaScript によってクライアントサイドでレンダリングした rel="canonical" タグを Googlebot は無視することが Google I/O 2018 で明らかになりました(rel="amphtml" も同様に無視される)。

しかしながら、JavaScript によって挿入された rel="canonical" をきちんと処理するケースが実際にはあるようです。

JS 挿入した canonical を Googlebot が認識することを実験で検証

JavaScript によってクライアントサイドのレンダリングで挿入した rel="canonical" を Google は本当に無視するのかどうかを Eoghan Henn(オーン・ヘン)氏がテストによって検証しました。
テストの手順と経過、結果の詳細はレポート記事で確認していただくとして、簡単にまとめると次のようなことが判明しました。

なお rel="canonical" の挿入には、Google タグマネージャ (GTM) を利用しています。

  • GTM で挿入した rel=”canonical” は検索結果においては想定どおりに処理された、つまりきちんと正規化された
  • (ベータ版)Search Console のインデックスカバレッジでは、「送信された URL が canonical として選択されていません」の警告がレポートされた。

最終的な検索結果の状況は I/O での発表と一致しませんでした。
しかし、Search Console では I/O で言われた動きと一致しています。

JS 挿入の canonical が機能するケースもあるらしいが頼るべきではない

この実験結果について、Google の John Mueller(ジョン・ミューラー)氏は次のようにコメントしています。

  • I/O での言及はどちらかというと注意喚起に近い。自分(ジョン)にとっても予想外のことだったので知らせたほうがいいと考えた
  • JS で挿入した rel="canonical" が常にではないがうまく機能するケースがあるようだ
  • ただしそれに頼るべきではない。確実に処理させたいならサーバーサイドで最初から rel="canonical" をレンダリングさせておくべき
  • JS によってクライアントサイドで上書きした rel="canonical" がきちんと処理されるかどうかは不確か

原則として canonical はサーバーサイドで配信すべし

1つの実験、しかも検証のために準備した環境なので断定はできませんが、JavaScript でレンダリングさせた rel="canonical" を Google が処理することがあるのは間違いないようです。
しかしそうは言っても、100%確実にという保証はありません。

また JS 挿入による rel=”canonical” が検索結果に反映されるまでには3週間ほどかかったとのことです。
JS をレンダリングしてインデックスするのは HTML のクロールとは別プロセスです。
検索結果に出るまでには時間がかかることがあるのはよく知られるところだし、Google I/O のセッションのなかでも触れられています。

サーバーサイドでも rel=”canonical” を配信し、クライアントサイドでも rel=”canonical”をレンダリングさせ、両者が一致していない場合は、おそらくクライアントサイドでの最終型が処理されるはずです。
しかし、これも保証はありません。

JavaScript によってレンダリングさせた rel=”canonical” を Google は実際には認識するようです。
ですが、そうしなければならないという特別な状況にない限りは、rel="canonical" はサーバーサイドで配信するのが安全確実です。