我做 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 擋住,爬蟲進得來才讀得到。
