同じ内容のページが複数のURLで存在するとき、AIクローラはどのURLを「正規」と判断するのでしょうか。 この判断を誤ると、AI検索で自社コンテンツが引用されない、あるいは意図しないURLが引用される問題が起きます。

canonicalタグは、重複コンテンツの中から「このURLが正規版です」と宣言するためのHTMLタグです。 Google検索では長年使われてきた仕組みですが、AI検索においても同様の役割を果たすと考えられます。

canonicalタグの基本

canonicalタグは、HTMLの <head> 内に記述するlinkタグです。

<head>
  <link rel="canonical" href="https://example.com/blog/article-1" />
</head>

この記述は「このページの正規URLは https://example.com/blog/article-1 です」という宣言です。

重複が発生する一般的なケース

https://example.com/blog/article-1
https://example.com/blog/article-1?utm_source=twitter
https://www.example.com/blog/article-1
http://example.com/blog/article-1
https://example.com/blog/article-1/

これらはすべて同じコンテンツを返しますが、クローラからは別々のページに見えます。 canonicalタグがなければ、クローラは独自に正規URLを推定しますが、その結果は予測できません。

AIクローラへの影響

重複排除への影響

LLMのトレーニングデータには重複排除(deduplication)の処理が含まれています。 同じ内容が複数URLで存在する場合、canonicalタグが設定されていれば正規URLが優先的に残ります。

RAGへの影響

AI検索の多くはRAG(Retrieval-Augmented Generation)で動いています。 RAGの検索結果に重複ページが混在すると、1つの情報源が複数枠を占有してしまいます。

canonicalで正規化しておくことで、引用URLが安定します。

自己参照canonicalの重要性

自己参照canonicalとは、ページが自身のURLをcanonicalに指定することです。

<!-- https://example.com/blog/article-1 のページ -->
<link rel="canonical" href="https://example.com/blog/article-1" />

「自分自身を指すなら不要では」と思われがちですが、パラメータ付きURLの正規化に効果があります。 ユーザーが ?utm_source=twitter 付きのURLでアクセスしても、canonicalタグがあれば正規URLが伝わります。

フレームワーク別の実装

// Next.js App Router
import { Metadata } from "next";

export async function generateMetadata({ params }): Promise<Metadata> {
  return {
    alternates: {
      canonical: `https://example.com/blog/${params.slug}`,
    },
  };
}
---
// Astro
const canonicalUrl = new URL(Astro.url.pathname, Astro.site).href;
---
<link rel="canonical" href={canonicalUrl} />

設定パターン

www有無の正規化

<!-- www.example.com のページでも non-www をcanonicalに指定 -->
<link rel="canonical" href="https://example.com/blog/article-1" />

サーバー側でも301リダイレクトを設定します。

server {
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

末尾スラッシュの統一

サイト全体でどちらかに統一し、canonicalタグ、サイトマップ、内部リンクのすべてで同じ形式を使います。

コンテンツシンジケーション

自社記事が他メディアに転載される場合、転載先に自社URLをcanonicalとして設定してもらいます。

<!-- 転載先のページ -->
<link rel="canonical" href="https://example.com/blog/original-article" />

AIが転載記事を見つけた場合でも、引用元は自社URLになります。

HTTPヘッダーでのcanonical

PDFなどHTML以外のコンテンツには、HTTPヘッダーでcanonicalを指定します。

HTTP/1.1 200 OK
Link: <https://example.com/docs/whitepaper.pdf>; rel="canonical"
location ~ \.pdf$ {
    add_header Link '<https://example.com$request_uri>; rel="canonical"';
}

よくある設定ミス

相対URLの使用。 canonicalタグには絶対URLを使ってください。 相対URLでも動作しますが、プロトコルやドメインの解釈がクローラによって異なるリスクがあります。

canonicalタグの重複。 CMSプラグインとテーマの両方が出力しているケースがあります。 複数存在すると、クローラはどちらを正規と判断すべきかわかりません。

noindexページへのcanonical。 noindexのページをcanonicalの参照先にすると、正規版がインデックスから除外される矛盾が生じます。

存在しないURLへのcanonical。 削除されたページのURLを指定しても、クローラは404を受け取るため機能しません。

リダイレクト先とcanonicalの矛盾。 リダイレクト先のページのcanonicalは、そのページ自身を指すべきです。

確認方法

# ページのcanonicalタグを抽出
curl -s https://example.com/blog/article-1 \
  | grep -i 'rel="canonical"'

# HTTPヘッダーのcanonicalを確認
curl -sI https://example.com/blog/article-1 \
  | grep -i "link:.*canonical"

複数ページの一括チェック

import requests
from bs4 import BeautifulSoup

def check_canonical(url: str) -> dict:
    try:
        r = requests.get(url, timeout=10)
        soup = BeautifulSoup(r.text, "html.parser")
        tag = soup.find("link", rel="canonical")
        canonical = tag["href"] if tag else None
        return {
            "url": url,
            "canonical": canonical,
            "is_self_referencing": canonical == url if canonical else False,
        }
    except requests.RequestException as e:
        return {"url": url, "error": str(e)}

urls = [
    "https://example.com/blog/article-1",
    "https://example.com/blog/article-1?utm_source=twitter",
    "https://www.example.com/blog/article-1",
]
for url in urls:
    result = check_canonical(url)
    print(f"{url}{result.get('canonical', 'None')}")

サイトマップとの一貫性

サイトマップのURLとcanonicalタグのURLは一致させてください。

# 一貫性のある設定
サイトマップ:  https://example.com/blog/article-1
canonical:     https://example.com/blog/article-1
内部リンク:    https://example.com/blog/article-1

# 問題のある設定
サイトマップ:  https://example.com/blog/article-1/   ← スラッシュあり
canonical:     https://example.com/blog/article-1     ← スラッシュなし

運用チェックリスト

  1. すべてのページに自己参照canonicalが設定されているか
  2. canonicalのURLとサイトマップのURLが一致しているか
  3. canonicalのURLが200を返すか
  4. canonicalタグが重複していないか
  5. HTTP/HTTPS、www有無が統一されているか

サイトリニューアル時にcanonicalタグが消失したり、URLの変更に追従できていないケースは少なくありません。 定期的な確認が必要です。

まとめ

canonicalタグは、AIクローラに「このURLが正規版です」と宣言する最も直接的な手段です。 AI検索における引用URLの安定性と、重複排除の精度に影響します。

最低限の対応として、すべてのページに自己参照canonicalを設定してください。 その上で、パラメータ付きURL、www有無、末尾スラッシュの正規化を統一し、サイトマップとの一貫性を保つことがGEO対策としてのcanonical運用の基本です。