跳至主要內容

    Canonical URL

    Canonical 用來指定主版本 URL,避免參數/排序/追蹤碼造成重複內容與權重分散。

    定義

    Canonical URL 是用 <link rel="canonical"> 指定「同一內容的主版本 URL」。當同內容可透過多個 URL 存取時,canonical 能避免重複內容稀釋排名訊號。

    為什麼重要

    • 避免 URL 參數與追蹤碼造成重複內容
    • 集中排名訊號到主版本頁面
    • 降低搜尋引擎爬取浪費
    • 解決分頁、排序、篩選產生的重複 URL 問題
    • 跨網域內容鏡像時指定權威來源
    • 防止 HTTP/HTTPS 或 www/non-www 版本分散權重
    • 讓 Search Console 報告更準確(合併資料到 canonical URL)

    怎麼做(實作重點)

    • canonical 要指向「可索引、HTTP 200、內容一致」的主版本
    • 避免把 canonical 指到無關頁或首頁(容易被視為錯誤訊號)
    • 搭配 sitemap 只提交 canonical URL
    • 每頁都要有 canonical,即使是自指(self-referencing)
    • 使用絕對 URL,不要用相對路徑
    • 確保 canonical URL 可訪問(不要指向 404 或 redirect)
    • 動態頁面用程式邏輯正確產生 canonical(不要寫死)

    範例

    html
    <!-- 基本 canonical 標籤 -->
    <link rel="canonical" href="https://example.com/products/iphone" />
    
    <!-- 分頁的 canonical(指向第一頁或 view-all) -->
    <link rel="canonical" href="https://example.com/products" />
    
    <!-- 帶參數的頁面指向乾淨 URL -->
    <!-- 當前 URL: /products/iphone?utm_source=newsletter -->
    <link rel="canonical" href="https://example.com/products/iphone" />
    typescript
    // React/Vite 動態產生 canonical
    import { useLocation } from 'react-router-dom';
    import { Helmet } from 'react-helmet-async';
    
    function SEOHead({ title, description }: SEOProps) {
      const { pathname } = useLocation();
      const baseUrl = 'https://example.com';
      // 移除 trailing slash 並產生 canonical
      const canonicalUrl = `${baseUrl}${pathname.replace(/\/$/, '') || '/'}`;
    
      return (
        <Helmet>
          <title>{title}</title>
          <meta name="description" content={description} />
          <link rel="canonical" href={canonicalUrl} />
        </Helmet>
      );
    }

    相關連結

    常見問題

    關於這個詞彙的常見問答。

    回到詞彙表