設定 Canonical 後,先確認代表頁與參數頁狀態
修正上線後,代表頁的 head 裡是一行指向自己的 rel="canonical",同群組的參數頁則把 href 寫成代表頁的乾淨網址,重複的 URL 收斂成一個代表。設定方式要看內容關係決定:追蹤、篩選、排序或規格參數產生相同或非常相似的內容,併到同一個代表頁;內容明顯不同就各自獨立。舊網址還要供人開啟,留著並用 Canonical 表達偏好;永久淘汰才換成 301。上線只算完成一半,後面仍要確認 render 後輸出的是那個絕對網址,以及 Search Console 裡 Google 選定的標準網址與頁面宣告是否同一個。
頁面狀態可以先從原始碼看出來。代表頁的 rel="canonical" 等於自己的網址,參數頁的 href 不帶 ?utm_source、?color、?sort 這類查詢字串。兩邊都出現,才算把代表偏好寫進頁面,而不是只改了其中一頁。
Google 搜尋中心的文件把重新導向與 rel="canonical" 都列為強烈訊號,Sitemap 列為微弱訊號,並說明這些方法可以疊加,卻都不是必要設定;沒有指定時,Google 會自行判斷哪個版本適合顯示。Canonical 因此是強烈但非強制的偏好表達,寫了不代表搜尋引擎一定採用。
驗證分成兩層,混在一起看會誤判。第一層是頁面輸出:head 裡有沒有一行 canonical、href 是不是代表頁的絕對網址、有沒有被 JavaScript 改掉。第二層是搜尋引擎的選擇:Search Console 會分別顯示使用者宣告的標準網址與 Google 選定的標準網址。
釐清 Canonical 標準網址處理的重複內容範圍
Canonical 標準網址處理的範圍,是一份內容同時掛在多個網址下的情況。同一個商品頁可以用 ?color=red、?size=10、?utm_source=facebook 開啟,內容幾乎一樣,網址卻各自獨立;Canonical 就是在這組網址裡指名哪一個代表全部。
重複的來源比想像中常見:
- 協定與主機名稱版本,例如 http 與 https、www 與非 www
- 網址結尾少了或多了一個斜線,/shoes 與 /shoes/
- 廣告與社群帶進來的追蹤參數,?utm_source、?gclid
- 篩選、排序產生的查詢字串
- 同一商品同時出現在多個分類目錄下
- 行動版或 AMP 版本的獨立網址
Canonical 的作用是在保留網址的同時,把訊號收在一個代表頁上,順便讓爬蟲不用把時間花在內容一樣的版本。
效力有一條界線:Canonical 用來處理相同或非常相似的內容。Google 會依內容相似度判斷哪些網頁算重複,兩頁主題差得遠,只因為網址長得像就指到同一頁,代表關係不成立。跨網域也能用,內容授權轉載到其他網站時,轉載方可以把 Canonical 指回原始頁。
用決策表選出自指頁與參數頁的代表頁
判斷從一個問題開始:這個網址是群組的代表頁,還是掛在代表頁底下的變體。代表頁指向自己,變體指向代表頁。
標準頁自我指向,參數頁不拿含參數的網址指向自己
自我參照的 Canonical 只放在標準頁上。參數頁常見的錯誤寫法,是模板直接抓當前網址輸出成 canonical,於是 ?color=red 這一頁的 canonical 也是 ?color=red,等於宣告自己是代表,同群組的其他網址完全沒有收斂。正確的做法是讓模板產生標記時排除追蹤與篩選變數,輸出不含查詢字串的代表網址。
AMP 與非 AMP 兩版互相標示
站上同時保留 AMP 與非 AMP 兩個版本,關係要寫在兩邊:非 AMP 頁用 rel="amphtml" 指向 AMP 頁,AMP 頁用 rel="canonical" 指向非 AMP 頁。
把幾種常見情況排成一張表,決策會清楚一些。
| 做法 | 適用情況 | 驗證方式 | 代價 |
|---|---|---|---|
| 代表頁自我指向 | 該頁是 URL 群組的代表頁,例如商品主頁、文章頁 | head 內的 canonical 等於該頁的絕對網址 | 模板要能排除查詢字串,否則參數頁會跟著一起自我指向 |
| 參數頁指向代表頁 | 追蹤、篩選、排序或規格參數產生相同或非常相似的內容,且頁面仍需存在 | 參數頁原始碼的 href 是不含查詢字串的代表網址 | 參數頁本身不承接訊號,流量與連結要靠代表頁累積 |
| 內容不同的頁面各自獨立 | 參數頁有獨立主題,或內容與代表頁明顯不同 | 兩頁的 canonical 各自指向自己,內容比對確認不相似 | URL 群組變多,需另外安排內部連結與 Sitemap 收錄 |
| AMP 頁與標準頁互相標示 | 站上同時保留 AMP 與非 AMP 版本 | AMP 頁有指向標準頁的 canonical,標準頁有指向 AMP 頁的 amphtml | 兩份輸出都要維護,其中一邊改版就會不一致 |
| 舊頁 301 到代表頁 | 舊 URL 要永久淘汰,不再供人開啟 | 回應標頭為 301,Location 指向代表頁 | 舊網址與其訊號一併退場,不能再當備援頁 |
表裡第三列最容易被跳過。參數頁有獨立主題、獨立文案或自己的庫存資訊,硬指向乾淨網址,等於把一個有搜尋需求的頁面藏起來。這類頁面先各自指定代表,再用內部連結把彼此的關係講明白。
在 HTML head 寫入絕對網址並檢查標籤
指定標準網址的 HTML 寫法只有一行,位置與網址形式卻常出錯。link 元素要放在 HTML 的 head 區段,href 用含協定與網域的絕對網址,一頁只留一個 canonical。
實際輸出像這樣:<link rel="canonical" href="https://example.com/shoes" />。相對路徑雖然瀏覽器看得懂,Google 文件仍建議避免,理由是長期下來容易造成問題,例如無意間讓測試網站受到檢索。
標籤放 head,href 寫絕對網址
head 以外的位置不會被採用,後台只開放內容編輯區的網站,把標籤貼在文章裡等於沒設。
JavaScript 插入的標記要在 render 後確認
由 JavaScript 產生 canonical 的頁面,檢視原始碼看不到那一行,因為原始碼是伺服器回傳的版本,標記是後來才被塞進 head。這時要用瀏覽器的開發者工具看 render 後的結果。非 HTML 檔案,例如 PDF,改用 HTTP 回應標頭裡的 Link 帶 rel="canonical",那是 HTML 元素之外的另一條路。
依舊頁是否保留選擇 Canonical 或 301
舊網址要不要留,決定用 Canonical 還是 301。兩者都在處理重複,結果不同:Canonical 讓舊頁繼續存在、繼續供人開啟,只把代表偏好送給搜尋引擎;301 把使用者和爬蟲一起送到新網址,舊網址等於退場。Google 文件把重新導向限定在淘汰重複網頁的情況,講的就是這個分界。
頁面仍需存在時保留並用 Canonical
頁面留著,Canonical 指向代表頁,訊號集中,使用者點的還是原本那一個網址,不會被中途帶走。
要淘汰的舊網址,301 的目標必須是同一組的代表頁,不能一邊 301 到 A、一邊 Canonical 指 B。兩套訊號指向不同目標,搜尋引擎只能挑一個,Search Console 於是出現宣告值與選取值不同的提示。這種衝突不會因為 canonical 寫得漂亮而消失。
驗證 Google 選定的標準網址是否一致
驗證的順序從頁面往外推。先確認每個代表頁回應 200、head 裡的 canonical 等於自己的絕對網址;再確認參數頁的 canonical 指向代表頁而不是自己;最後確認 Sitemap、站內連結與 301 的目標都落在同一個代表 URL 上。
訊號一致比訊號數量重要。Canonical 指 A、Sitemap 列 B、站內連結連 C,三份資料各自說一種答案,於是出現宣告與選取不同步的結果。這種情況先修一致性,再回頭檢討標籤寫法。
Search Console 的「網頁」報表把收錄狀況分類,其中「替代頁面(有適當的標準標記)」列出的是 Google 認為屬於某個代表頁的網址。搭配使用者宣告的標準網址與 Google 選定的標準網址兩個欄位對照,就能看出哪一組還沒對上。值一致,代表這組設定已被採用;值不同,回到 URL 群組、內部連結與訊號衝突重新檢查。
驗證通過的畫面很具體:代表頁以自己的網址被收錄,參數頁歸在替代頁面,兩邊的宣告值相同。到這裡,代表頁決策才算真的落地。由技術 SEO 接手代表頁決策與驗證
站方可逐項確認:代表頁是否回應 200,且 canonical 是否等於自己的絕對網址?參數頁是否指向預定代表頁?Search Console 的「使用者宣告的標準網址」與「Google 選定的標準網址」是否一致?任一答案為否時,就回到 URL 群組、Sitemap、站內連結與 301 目標重新檢查。