通用面試:robots.txt、noindex 與 canonical 如何協同避免錯誤索引?
題干與適用場景
一個多語系網站有公開頁、登入後頁面和臨時預覽頁。團隊把預覽路徑寫入 robots.txt 的 Disallow,同時給頁面加上 noindex,並在所有語言頁使用同一個 canonical。上線後,預覽 URL 仍出現在搜尋結果,部分語言頁的索引 URL 也不正確。請解釋三類訊號的邊界,並給出遷移和驗證方案。
面試官考察點
- 是否區分「允許抓取」「允許索引」和「首選 URL」三個問題。
- 能否說明被 robots.txt 阻止時,爬蟲可能看不到 noindex。
- 是否處理 HTML meta robots、HTTP
X-Robots-Tag、canonical 與重新導向的衝突。 - 能否設計多語系、快取、發布回滾和 Search Console 驗證流程。
回答前需要釐清的問題
- 目標是阻止抓取、阻止索引,還是把重複 URL 合併到一個規範 URL?
- 頁面是否需要被搜尋引擎抓取後,才能發現 noindex 或 canonical?
- 預覽頁是否有登入保護,是否會被外部連結或網站地圖引用?
- 多語系頁是否是一一對應的翻譯,是否有獨立的 canonical 與 hreflang?
- CDN、應用伺服器和 HTML 模板分別在哪裡設定這些回應標頭和標籤?
30 秒回答框架
我會先把目標拆成抓取、索引和規範化。robots.txt 控制爬蟲能否請求資源;noindex 控制頁面不進入搜尋索引,但通常需要爬蟲能存取頁面才能看到;canonical 是重複或近似頁面的首選 URL 提示,不是強制重新導向。預覽頁應使用登入保護或可存取的 noindex,正式頁使用自我指向 canonical,語言頁分別指向自身並用 hreflang 互相宣告,再透過抓取、索引報告和實際 HTML 驗證。
分步驟深入解答
第一步:先定義三種控制面
robots.txt 位於網站根路徑,回答「爬蟲能否請求這個路徑」。它不等同於刪除索引,也不保證 URL 不會因外部連結而出現在結果中。noindex 是頁面級索引指令,適合測試頁、搜尋結果頁或不希望展示的資源。canonical 是 URL 選擇訊號,用於表達重複或近似內容的首選地址。
第二步:不要用 Disallow 隱藏 noindex
如果同一路徑同時 Disallow,爬蟲可能無法取得頁面內容,也就看不到 meta robots 或 X-Robots-Tag: noindex。要讓 noindex 生效,應允許抓取該 URL,並透過 HTML 或 HTTP 標頭返回 noindex;絕密內容則使用驗證、授權或適當狀態碼。遷移期間先移除阻擋抓取的規則,再等待重新抓取和索引更新。
第三步:選擇頁面級 noindex 載體
HTML 頁面可在 head 中設定 meta name="robots" content="noindex,follow";非 HTML 資源或統一閘道也可使用 X-Robots-Tag。指令應由頁面模板和回應標頭快照測試確認,避免 CDN 快取舊標頭。對只需隱藏索引但仍要發現連結的頁面,可以保留 follow;是否跟隨連結仍取決於爬蟲策略,不能當成存取控制。
第四步:設計 canonical 與多語系映射
每個可索引語言頁通常使用絕對、可存取、自我指向的 canonical,並確保狀態碼、協定、主機和路徑一致。翻譯頁不要全部 canonical 到預設語言,否則會把獨立語言內容合併掉。用 hreflang 表達互為替代版本;網站地圖、內部連結和 canonical 應使用同一組規範 URL。
第五步:處理遷移、重新導向與快取
URL 遷移應以伺服器端永久重新導向為主,舊 URL 的 canonical 不能取代重新導向。新頁面上線時先確認 200、canonical、robots 指令和 hreflang,再提交網站地圖。CDN 需要按 URL 和回應標頭正確失效,避免同一頁在不同邊緣節點返回不一致訊號;回滾時保留舊 URL 的重新導向和索引策略。
第六步:建立可觀測排查路徑
先用抓取工具檢查 robots.txt 是否允許請求,再讀取即時 HTML 和回應標頭,確認 noindex/canonical 是否與模板一致。隨後查看 Search Console 的抓取與索引狀態、Google 選定的 canonical、最後抓取時間和網站地圖發現來源。將 URL、語言、狀態碼、canonical、robots 指令、快取年齡和發布版本寫入稽核紀錄。
第七步:定義驗收與回歸測試
為每種頁面類型建立斷言:預覽頁可抓取且 noindex,正式語言頁 200 且自我指向 canonical,舊 URL 301 到新 URL,受保護頁面不洩露內容。測試 robots.txt 規則邊界、大小寫和尾部斜線,檢查 HTML 與 X-Robots-Tag 衝突,驗證 CDN 清快取後的多節點結果,並定期抽樣 Search Console 狀態。
高品質示範回答
三種訊號解決不同問題:robots.txt 決定是否請求,noindex 決定是否進入索引,canonical 提示重複內容的首選 URL。預覽頁不能只寫 Disallow 後期待 noindex 生效;應允許抓取並返回 noindex,敏感內容使用驗證。多語系正式頁各自自我指向 canonical,使用 hreflang 互鏈,網站地圖和內部連結保持一致。遷移用 301,發布後從 robots、即時回應、快取、抓取紀錄和 Search Console 逐層驗證。
常見錯誤
- 把 robots.txt 當作從搜尋結果刪除 URL 的工具。
- 同時 Disallow 頁面又要求爬蟲讀取 noindex。
- 讓所有語言頁 canonical 到一個語言,導致翻譯頁被當成重複頁。
- 只檢查原始碼,忽略 CDN 快取和
X-Robots-Tag回應標頭。 - 用 canonical 代替必須執行的 301 重新導向或存取控制。
追問及應對
追問一:被 robots.txt 阻止的 URL 為什麼仍可能出現在結果中?
爬蟲可能從外部連結發現 URL,但因無法抓取而看不到頁面內容。搜尋引擎仍可能展示 URL 或有限資訊,因此要阻止索引,應讓爬蟲存取並讀取 noindex,或使用驗證限制存取。
追問二:canonical 是強制指令嗎?
它是搜尋引擎用來選擇規範 URL 的訊號,可能被忽略。內容、重新導向、內部連結、網站地圖和 canonical 應一致,不能把它當作存取控制或刪除保證。
追問三:預覽頁需要保留外部連結發現能力怎麼辦?
允許抓取頁面並返回 noindex;若預覽內容敏感,則優先使用登入、簽名 URL 或其他存取控制。不要依賴 robots.txt 隱藏機密內容。
追問四:HTTP 標頭和 meta robots 衝突時如何處理?
統一由一個頁面策略產生器輸出,並在邊緣和來源伺服器同時取樣驗證。若存在衝突,不能憑假設判斷結果,應依實際回應標頭、HTML 和目標搜尋引擎文件修正為單一明確策略。
追問五:如何驗證多語系 canonical 沒有回環?
抓取每個語言 URL,檢查 canonical 是絕對可存取 URL 且自我指向;再驗證 hreflang 回應互相可達、語言代碼正確,網站地圖和內部連結沒有指向舊主機或錯誤語言。