我做 SEO 快滿二十年,被問最多、也最容易出包的技術題,就是這三個工具的分工:robots.txt、noindex、canonical。它們的名字聽起來都跟「搜尋引擎要不要理我這頁」有關,於是很多人把它們當成同一種開關輪流亂試,結果不是該藏的頁藏不掉,就是該留的頁不見了。我這篇不談廣義的索引控制原則,而是把焦點放在一件事:這三者各自管的層級不同,混用時會互相打架,而且打架的方式很反直覺。

先講一句我常對工程師說的話:抓取(crawl)、索引(index)、重複歸屬(canonicalization)是三段不同的流程,分別由不同工具負責。你如果用管抓取的工具去解決索引問題,或用處理重複的工具去解決不想曝光的問題,通常會得到看起來有效、實際埋雷的結果。

1. 三個工具各自站在哪一段流程

1.1 robots.txt 管的是「爬蟲要不要進門」

robots.txt 放在網站根目錄,是一份給爬蟲看的通行規則。它控制的是抓取行為:某個路徑要不要讓爬蟲去讀取內容。當你在裡面寫 Disallow,等於在門口掛牌「這條路不要走進去」。

關鍵在於,被 Disallow 的頁面,爬蟲連內容都不會讀。它可能還是知道這個網址存在(例如別的頁面連過去),但它讀不到頁面裡面寫了什麼。這一點是後面所有錯誤的根源,先記住。

User-agent: *
Disallow: /cart/
Disallow: /account/
Sitemap: https://example.com/sitemap.xml

1.2 noindex 管的是「這頁要不要進索引庫」

noindex 是一個明確的指令,告訴搜尋引擎:你可以來讀,但讀完之後不要把這頁收進搜尋結果。它通常放在頁面的 meta 標籤裡,或用 HTTP 回應標頭送出。

<meta name="robots" content="noindex, follow">

我特別提醒一件事:noindex 是頁面層級的指令,而且爬蟲必須真的讀到這行標籤,指令才會生效。它跟 robots.txt 不同,robots.txt 是連讀都不讀,noindex 則是讀了之後才決定不收。這個差異等下會變成最經典的一種踩雷。

1.3 canonical 管的是「重複內容算在哪一頁」

canonical 處理的是完全不同的情境:當你有好幾個網址內容幾乎一樣(例如帶不同追蹤參數、排序參數、或分頁的變體),你希望搜尋引擎把它們視為同一份內容,並且把權重與排名歸給你指定的那一個「主版本」。

<link rel="canonical" href="https://example.com/products/seo-tools/">

canonical 不會叫搜尋引擎「不要收錄某頁」,它是說「這幾頁其實是同一件事,請以我指定的這頁為準」。它是一個強烈的建議,不是命令,搜尋引擎有可能不採用你的指定,這點跟 noindex 的強制性差很多。

2. 為什麼這三個這麼容易被搞混

2.1 抓取跟索引在腦中被壓成同一件事

多數人直覺上認為「不讓搜尋引擎看到某頁」就是一個動作,但實際上有兩道關卡。第一道是抓取:爬蟲會不會去讀。第二道是索引:讀完之後會不會收進搜尋結果。robots.txt 卡的是第一道,noindex 卡的是第二道。你想達成的目標不同,要動的關卡就不同。

我實務上看過最多的情況,是團隊想把某個後台或測試區「藏起來不被搜到」,於是在 robots.txt 擋掉。過一陣子卻發現,那頁的網址還是出現在搜尋結果裡,只是標題底下寫著「因為這個網站的 robots.txt,系統無法提供這個頁面的說明」。原因就是 robots.txt 只擋了讀取,沒擋收錄。

2.2 一個判斷你該用哪個的簡單問法

我教新人時只讓他們問自己一句話:「我是不想讓它被爬,還是不想讓它出現在搜尋結果?」如果是前者,可能牽涉爬取預算或伺服器負擔,考慮 robots.txt。如果是後者,幾乎都該用 noindex。至於 canonical,只有在「內容重複、要指定主版本」時才登場,它跟前兩者的目的根本不在同一條線上。

3. 最經典的雷:noindex 頁又被 robots.txt 擋住

3.1 為什麼這個組合會失效

這是我每年都會遇到好幾次的狀況,也是這篇最想講清楚的一段。有人想把一頁徹底藏好,於是同時做了兩件事:在頁面加上 noindex,又在 robots.txt 把這條路徑 Disallow。聽起來很保險,對吧?實際上這兩個設定會互相抵消。

邏輯是這樣:noindex 這行指令寫在頁面內容裡,爬蟲要讀到頁面內容才看得到它。但你又用 robots.txt 擋住了抓取,爬蟲根本不會去讀這頁,於是它永遠看不到那行 noindex。結果就是這頁可能因為外部連結而被搜尋引擎知道存在,卻因為讀不到 noindex 而無法被移除,反而以一種很難看的形式留在搜尋結果裡。

3.2 我實務上怎麼排查這類問題

我通常分享一個排查順序給客戶的技術團隊。第一步,先在搜尋引擎用 site 指令或站長工具的網址檢查功能,確認這頁到底有沒有被收錄。第二步,如果被收錄了,去看它是不是同時掛著 noindex 又被 robots.txt 擋。第三步,若兩者都有,先把 robots.txt 的封鎖拿掉,讓爬蟲能進來讀到 noindex,等它確實把頁面移出索引之後,再視需要決定要不要重新擋抓取。

順序不能顛倒。很多人急著把兩層都設好設滿,反而讓自己動彈不得。要移除一頁,得先讓移除的指令被讀到。

3.3 正確的先後順序

你的目標 該用的工具 不要同時做的事
把已被收錄的頁移出搜尋結果 加 noindex,並確保爬蟲讀得到 不要同時用 robots.txt 擋這頁
已用 noindex 移除、之後想省爬取 確認移除後再考慮 robots.txt 不要在移除前就擋抓取
純粹不想浪費爬取預算在無意義路徑 robots.txt Disallow 這類頁通常本來就不該被收錄

4. canonical 跟 noindex 該不該一起出現

4.1 一個是建議,一個是指令

我常被問:重複內容的頁面,我到底要下 canonical 還是 noindex?這兩個目的其實不一樣。canonical 是說「這幾頁是同一件事,請把權重集中到主版本」,你其實還是希望這份內容被搜尋引擎理解、被排名,只是希望歸到某一頁。noindex 則是說「這頁不要進搜尋結果」,是要把它排除掉。

所以先問自己:這頁是「重複但仍有價值、想集中權重」,還是「根本不該出現在搜尋結果」?前者用 canonical,後者用 noindex。目的不同,不該混為一談。

4.2 兩個一起下的時候會怎樣

如果你在同一頁同時放了指向別頁的 canonical 又放 noindex,你等於送出兩個矛盾訊號:canonical 說「請把我算進主版本」,noindex 說「請把我排除」。搜尋引擎收到互相打架的訊號時,處理方式不一定符合你的預期,可能忽略其中一個,也可能把 noindex 的訊號連帶影響到你指定的主版本。我的建議很簡單,同一頁不要同時用這兩個處理重複的手段,先想清楚你到底要集中權重還是要排除,選一個。

4.3 帶參數的網址怎麼處理最省事

以帶追蹤參數的網址為例(例如某個活動連結後面掛了一串來源標記),這類頁內容跟原頁一模一樣。我幾乎都建議用 canonical 指回乾淨的原始網址,而不是 noindex。因為這些變體本身有流量價值,你要的是把它們的權重併回主頁,不是把它們消失。用 canonical 才符合這個意圖。

5. 依情境挑對工具的對照表

5.1 三個工具的核心差異一次分清楚

面向 robots.txt noindex canonical
管的層級 抓取(要不要讀) 索引(要不要收) 重複歸屬(算哪一頁)
強制性 指令(對多數合規爬蟲) 指令 建議,搜尋引擎可不採用
爬蟲需不需要讀到頁面內容 不需要,擋在門外 需要,讀到標籤才生效 需要,讀到才知道指向
對權重的影響 被擋頁不傳遞內部連結權重 頁不進索引,連結可設 follow 權重集中到主版本
典型使用情境 後台、購物車、無意義參數路徑 薄內容頁、感謝頁、內部搜尋結果頁 參數變體、排序頁、分頁、跨網域同稿

5.2 一個我常用的決策順序

面對一頁不確定該怎麼處理時,我會照這個順序想。第一,這頁是不是跟別頁重複?是的話,先判斷它有沒有獨立價值,有價值就 canonical 指向主版本,沒價值就 noindex。第二,如果不是重複問題,而是這頁我單純不想它出現在搜尋結果,直接 noindex,而且千萬別再拿 robots.txt 去擋它。第三,只有當某個路徑量大、對爬取預算或伺服器造成負擔、而且本來就不需要被收錄時,我才動 robots.txt。這個順序能避開九成以上的混用災難。

5.3 我踩過也看別人踩過的三個地雷

第一個,把整個網站在上線前用 robots.txt 全站 Disallow,上線後忘了拿掉,結果新站幾個月都進不了搜尋結果。第二個,想下架一批舊頁,只加了 noindex 卻同時保留了舊的 robots.txt 封鎖,noindex 讀不到,舊頁卡在半死不活的狀態。第三個,對分頁系列每一頁都 noindex,把本來能靠內部連結傳遞下去的權重整條切斷。這三個我都親眼見過,共通點都是沒先分清楚自己要動的是哪一段流程。

6. 常見問題

6.1 robots.txt 擋掉一頁,它就不會出現在搜尋結果了嗎?

不一定。robots.txt 擋的是抓取,不是收錄。如果這頁被其他頁面連到,搜尋引擎可能仍知道它存在並把網址列進結果,只是無法顯示內容說明。要確保不出現在結果,應該用 noindex,並讓爬蟲讀得到。

6.2 我想徹底藏一頁,是不是 noindex 加 robots.txt 一起上最保險?

剛好相反,這是最常見的失效組合。robots.txt 會擋住爬蟲,讓它讀不到 noindex,那行移除指令等於沒送出。正確做法是先只用 noindex,等頁面確實被移出索引後,再視需要決定要不要加 robots.txt。

6.3 canonical 可以取代 noindex 來下架頁面嗎?

不建議。canonical 是重複歸屬的建議,搜尋引擎有可能不採用,而且它的用意是集中權重,不是排除頁面。如果你要的是「這頁不要出現」,該用的是 noindex。兩者目的不同。

6.4 帶 UTM 之類參數的網址,我該 noindex 還是 canonical?

多數情況用 canonical 指回乾淨的原始網址比較合適。這類變體內容跟原頁相同、又常帶著流量,你要的是把權重併回主頁,而不是讓它消失。noindex 會把它整個排除,反而浪費了它累積的連結價值。

6.5 同一頁同時放 canonical 又放 noindex 會怎樣?

會送出互相矛盾的訊號:canonical 要求歸入主版本,noindex 要求排除。搜尋引擎的處理結果不一定符合你的預期,甚至可能連帶影響你指定的主版本。建議同一頁只選一種處理重複或排除的方式,先想清楚目的再下手。

6.6 加了 noindex 後多久頁面才會從搜尋結果消失?

要等爬蟲下次重新抓到這頁、讀到那行指令、再更新索引,時間長短視這頁被重新抓取的頻率而定,可能數天到數週不等。想加快,可以透過站長工具主動請求重新檢查該網址,但前提還是這頁沒有被 robots.txt 擋住,爬蟲進得來才讀得到。