robots.txt 怎麼寫?語法、常見錯誤與 AI 爬蟲

TL;DR
- robots.txt 控制的是「要不要爬」,不是「要不要收錄」;被擋的網址仍可能出現在搜尋結果裡
- 想讓頁面不被收錄要用
noindex,而noindex生效的前提是那一頁不能被 robots.txt 擋住 - Google 只讀四個欄位:
user-agent、allow、disallow、sitemap,crawl-delay不支援 - 寫在 robots.txt 裡的
noindex從 2019 年 9 月起完全無效,但這種寫法至今還在流傳 - 實測台灣 21 個網站:只有新聞媒體在管 AI 爬蟲,電商、旅遊、求職、論壇一家都沒設
目錄
擋的是爬取,不是收錄
檔案放哪裡、管得到哪些網址
語法只有四個欄位,其餘一律被忽略
規則怎麼比對:最長路徑優先,打平取最寬鬆
寫在 robots.txt 裡的 noindex 早就沒有作用
AI 爬蟲:台灣 21 個網站的實際做法
六個常見錯誤
一份夠用的最小範本
引言
robots.txt 是網站根目錄下的一個純文字檔,用來告訴爬蟲哪些網址可以抓、哪些不要抓。它的規格比 sitemap 更老,2022 年才由 RFC 9309 正式標準化,而在那之前的二十多年,各家搜尋引擎的實作各有差異——這是網路上關於 robots.txt 的說法特別混亂的原因。
混亂的代價不小。它是少數「寫錯一行就可能讓整個網站從搜尋結果消失」的檔案,而且沒有任何警告:語法錯誤不會報錯,只會被忽略;規則寫過頭也不會提示,網站就是慢慢從搜尋結果掉下去。
下面會先釐清它實際上能做什麼——這一層弄錯的話,後面的語法寫得再對也沒有用——再談怎麼寫,以及那個幾乎每份中文教學都寫錯的地方。
擋的是爬取,不是收錄
後面每個決定都建立在這一點上,而它偏偏是最常被弄反的:robots.txt 管的是「要不要抓取這一頁」,不是「要不要把這一頁放進搜尋結果」。 抓取與索引在 Google 內部是兩個分開的階段,robots.txt 只碰得到前面那個。
Google 官方文件寫得很直接:「如果網頁遭到 robots.txt 檔案封鎖,或是檢索器無法存取該網頁,檢索器將永遠看不到 noindex 規則,因此該網頁仍可能出現在搜尋結果中,例如當其他網頁連結到該網頁時。」
把這句話展開,用 Disallow 擋掉一個網址得到的其實是這樣的結果:Google 不去讀它的內容,但只要別的網站連向它,Google 仍然知道這個網址存在,於是照樣可能把它列進搜尋結果——只是因為從沒讀過內容,摘要那一欄會是空的,或是一句制式說明。
順著這個邏輯往下推,就會撞上一個很多人踩到的矛盾。想讓某一頁不出現在搜尋結果,正確做法是讓 Google 讀得到它,然後在頁面上放 noindex。 反過來用 robots.txt 擋住的話,Google 連那一頁都打不開,自然也讀不到裡面的 noindex,結果是那一頁反而留在索引裡——你越用力擋,它越擋不掉。
兩者的適用情境是分開的:
| 目的 | 做法 |
|---|---|
| 不希望浪費爬取資源(例如站內搜尋結果頁、無限組合的篩選網址) | robots.txt Disallow |
| 不希望出現在搜尋結果 | 頁面放 noindex,且不要用 robots.txt 擋 |
| 內容根本不該被任何人看到 | 密碼保護或移除,robots.txt 不是安全機制 |
表格最後一列要多說一句,因為它是實務上最常被誤用的一種。robots.txt 是公開的檔案,網址固定、誰都能讀,把後台路徑寫進 Disallow 等於在門口貼公告說「這裡有東西」——對一般爬蟲有效,對真正想找的人則是提示,不是阻擋。
檔案放哪裡、管得到哪些網址
位置與管轄範圍的規則比多數人以為的嚴格,而且錯了不會有任何提示,只是整份檔案被當成不存在。
首先,它必須放在網域根目錄,也就是 https://example.com/robots.txt;放進子目錄的話不會被讀取,等於白寫。
管轄範圍限於同一個主機、協定與連接埠。 Google 的文件寫得很明確:robots.txt「僅適用於代管該檔案的主機、通訊協定和連接埠號碼」。實務上的意思是:
blog.example.com不吃example.com的 robots.txt,子網域要自己放一份https://與http://理論上是兩份,但 80 與 443 分別是各自協定的預設埠,視為對等
檔案大小上限 500 KiB,超過的部分直接被忽略。一般網站遠遠用不到,但如果是程式產生、動輒上萬行的 robots.txt,就該檢查尾端的規則有沒有被切掉。
robots.txt 本身的回應狀態碼,處理方式差很多:
| 狀態 | Google 的處理 |
|---|---|
| 2xx | 正常解析 |
| 3xx | 最多跟五次轉址,超過視為 404 |
| 4xx(429 除外) | 視為沒有任何限制,全部可爬 |
| 5xx | 先停爬 12 小時,之後改用最多 30 天的快取版本;再無法解決則視為沒有限制 |
這張表最關鍵的是 4xx 與 5xx 的差別。回 404 其實不是問題,那等於「沒有限制」,跟根本不放這個檔案的效果一樣;真正要避免的是 5xx,因為伺服器出錯會讓 Google 直接停止爬取。也因此,「robots.txt 一定要有」這句流傳很廣的話講得太滿——沒有它,行為是明確可預期的,而有一份卻會噴 500 的,反而比較危險。
Google 一般會快取 robots.txt 最多 24 小時,所以改完不會立刻生效。
語法只有四個欄位,其餘一律被忽略
Google 支援的欄位只有四個:user-agent、allow、disallow、sitemap。其他的欄位在解析時直接跳過,不會報錯。
最小的一份是這樣:
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap.xml
User-agent: * 代表這組規則適用於所有爬蟲,Allow: / 代表整站開放。至於 Sitemap: 那一行,它是不需要登入任何後台就能通知所有搜尋引擎的一種方式,加了沒有壞處,完整說明在 sitemap 是什麼?產生、提交與 Google 實際會讀的欄位。
要擋特定目錄:
User-agent: *
Disallow: /admin/
Disallow: /search
Allow: /
Sitemap: https://example.com/sitemap.xml
要對不同爬蟲給不同規則,就寫成多組,各組之間空一行:
User-agent: Googlebot
Disallow: /no-google/
User-agent: *
Disallow: /admin/
這裡有一個相當常見的誤解:一個爬蟲只會套用一組規則。它會挑名稱最精確的那一組,套用之後就不再理會其他組,因此上面那個例子裡的 Googlebot 完全不受 User-agent: * 那組的 /admin/ 限制——多數人以為兩組會疊加,但實際上是取代。想讓 Googlebot 也擋 /admin/,必須在它自己那一組裡再寫一次。
# 之後到行尾是註解。
另外,crawl-delay 不支援。這個欄位曾經很流行,用來要求爬蟲放慢速度,但 Google 從來沒有支援過,寫了也只是被忽略(Bing 與 Yandex 有各自的處理方式)。要控制 Google 的爬取速率,管道在 Search Console,不在這個檔案裡。
規則怎麼比對:最長路徑優先,打平取最寬鬆
當一個網址同時符合好幾條規則時,優先順序有明確定義。
依規則路徑的長度取最精確的那一條;長度相同而彼此衝突時,Google 採用限制最少的那一條。
舉例來說:
User-agent: *
Disallow: /products/
Allow: /products/featured/
/products/featured/shoes 同時符合兩條,但 Allow 那條的路徑比較長、比較精確,所以可以爬。而 /products/old 只符合 Disallow,擋掉。
兩個萬用字元:
*代表零個或多個任意字元$代表網址結尾
Disallow: /*?sort= # 擋掉所有帶 sort 參數的網址
Disallow: /*.pdf$ # 擋掉所有以 .pdf 結尾的網址
結尾的 * 沒有意義,/fish* 等同於 /fish。
路徑大小寫有別:欄位名稱(Disallow 或 disallow)不分大小寫,但路徑值完全照字面比對——/Admin/ 擋不到 /admin/。
還有一個細節容易忽略,而它造成的誤擋通常很久之後才被發現:Disallow: /admin 沒有加結尾斜線時走的是前綴比對,於是 /administrator、/admin-login 這些你可能沒打算擋的網址會一併被擋掉。要精確只擋那個目錄,把斜線補上,寫成 Disallow: /admin/。
寫在 robots.txt 裡的 noindex 早就沒有作用
網路上到現在仍能找到「在 robots.txt 加一行 Noindex: /path」的教法,而且通常寫得相當肯定。Google 在 2019 年 9 月 1 日已經完全移除對這類規則的處理,所以照著做的人得到的是一行被靜默忽略的文字,以及一個以為已經處理好、其實還在索引裡的頁面。
官方公告講的是 crawl-delay、nofollow、noindex 這三個從未被正式文件記載的欄位。他們分析全網 robots.txt 後發現,這些規則的用法「在除了 0.001% 以外的所有 robots.txt 檔案中,都與其他規則互相矛盾」,並直言「這些錯誤以網站管理員並非本意的方式,傷害了網站在 Google 搜尋結果中的呈現」。
公告同時列出替代做法,依情境選用:
noindex放在 robots meta 標記或 HTTP 回應標頭 — 允許爬取的前提下,這是把網址移出索引最有效的方式- 404 或 410 狀態碼 — 兩者都代表頁面不存在,爬過之後就會從索引移除
- 密碼保護 — 除非另外標記為訂閱或付費內容,放在登入之後通常會移出索引
- robots.txt 的
Disallow— 官方把它列為選項,但同時說明:搜尋引擎仍可能依據其他頁面的連結索引該網址 - Search Console 的移除網址工具 — 快速但是暫時性的
第 1 項與第 4 項不能同時用,理由在前面那一節。
AI 爬蟲:台灣 21 個網站的實際做法
robots.txt 現在多了一個用途:決定要不要讓 AI 系統讀你的內容。ChatGPT、Claude、Perplexity 這些服務的爬蟲都各有自己的 user-agent 名稱,可以用一般的 robots.txt 語法處理。
網路上的討論多半停在「可以擋」這個層次,至於實際上大家怎麼選、選的比例如何,幾乎查不到。既然這份檔案人人都讀得到,那就自己數一遍——我在 2026 年 8 月抓了 21 個台灣主要網站的 robots.txt 逐份看過,涵蓋新聞媒體、電商、旅遊、求職與論壇。
結果的分界線非常乾淨:
- 21 站中取得 robots.txt 的有 16 份
- 其中 7 站在檔案裡點名了 AI 爬蟲
- 這 7 站全部是新聞或科技媒體(中時、中央社、INSIDE、科技新報、ETtoday、聯合新聞網、風傳媒)
- 電商、旅遊、求職、論壇這幾類,一站都沒有
在有處理的媒體之中,5 站是明確封鎖(Disallow: /)。被擋最多的是 GPTBot 與 ClaudeBot,各 5 站;其次是 CCBot 與 Bytespider,各 4 站。
但有一家的選擇完全相反。 ETtoday 點名了同一批爬蟲,寫的卻是:
User-agent: ClaudeBot
Allow: /
User-agent: GPTBot
Allow: /
同一個產業、同一批爬蟲,一邊全擋、一邊明確放行。這不是誰寫錯了,而是兩種對「內容被 AI 讀走」的判斷——一邊認為那是被拿去訓練卻沒有回報,一邊認為那本身就是曝光。這個題目目前沒有標準答案,所以會出現同業之間各走各的的情況。
有意思的是,這種帶有商業判斷的決定,最後是寫在一個公開的純文字檔裡的。想知道某一家同業對這件事的態度,不必打聽,去讀他們的 robots.txt 就好。
那麼一般企業網站該怎麼選?先分清楚兩種爬蟲,它們的目的不同:
| 類型 | 例子 | 擋掉的後果 |
|---|---|---|
| 訓練用 | GPTBot、CCBot、Google-Extended、Applebot-Extended | 內容不進訓練資料 |
| 即時檢索用 | OAI-SearchBot、ChatGPT-User、PerplexityBot | AI 回答問題時不會引用你 |
兩類的代價差很多。第一類擋掉,影響的是很久以後的模型;第二類擋掉的後果則相當直接——使用者問「台南有哪些網頁設計公司」時,AI 會即時去搜尋、抓網頁、整理成答案,被擋的網站就不會出現在那份名單裡。
回頭看那 7 家媒體,他們的選擇有其道理:內容本身就是商品,被整篇拿走而讀者不必來訪,那是純損失。但這個算式換到一般企業身上就不成立了——對靠被找到來獲客的公司來說,全面封鎖等於主動退出這個管道,而且退出的時候不會有人通知你。
如果沒有明確理由要擋,預設全部開放是合理的。真的要限制,也建議只擋訓練用的那一類,保留即時檢索。不過放行只是把門打開而已。被爬取和被引用是兩回事——伺服器紀錄看得到某個 AI 爬蟲來過哪些頁面,但那份紀錄不會告訴你內容最後有沒有被整理進答案裡。這兩件事要分開量,也是完全不同的題目。
六個常見錯誤
一、用 robots.txt 想達成不被收錄。 前面講過,方向相反。
二、Disallow: / 留在正式站。 開發或測試環境常會擋全站,上線時忘記改回來。這一行會讓整個網站逐漸從搜尋結果消失,而且過程中不會有任何警告,等到有人發現流量不對,通常已經掉了好幾週。改版上線後第一時間就該確認這個檔案。
三、擋掉 CSS 與 JS。 曾經有「擋掉靜態資源省爬取預算」的說法。Google 現在需要渲染頁面才能正確判讀內容與行動裝置相容性,擋掉樣式與腳本會讓它看到一個壞掉的版本。
四、以為子網域共用一份。 shop.example.com 需要自己的 robots.txt。
五、把敏感路徑寫進去。 這個檔案是公開的,寫進去等於公告位置。
六、robots.txt 回 5xx。 4xx 沒問題(視為無限制),5xx 會讓 Google 停止爬取。如果這個檔案是程式動態產生的,要確認它在資料庫或後端出錯時會回什麼。
順帶一提,我在做上面那份調查時,就遇到兩個網站對一般客戶端回 403、一個回 404。依前面那張表,404 等同無限制、403 同屬 4xx,處理方式一樣,所以這些站不會因此出事。不過這裡不能反推 Googlebot 也拿不到——多數網站會把搜尋引擎的爬蟲列入白名單,我用一般瀏覽器識別字串抓不到,不代表 Googlebot 抓不到。
一份夠用的最小範本
把前面幾節的結論收攏起來,多數企業網站其實不需要複雜的 robots.txt,下面這一份就夠了:
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap.xml
本站的 robots.txt 目前就是這三行:全站開放,加上一行 sitemap 位置。網站不大、沒有真的需要擋的路徑時,這就是正確答案;規則寫得多不會讓它變得更好,只會多出幾個出錯的機會。
有站內搜尋或大量篩選網址的話,加上這幾行避免爬蟲在無限組合裡打轉:
User-agent: *
Disallow: /search
Disallow: /*?sort=
Disallow: /*?filter=
Allow: /
Sitemap: https://example.com/sitemap.xml
改完之後可以在 Search Console 確認 Google 實際讀到的版本與解析結果,那裡也會顯示語法問題。Search Console 的設定方式見 Google Search Console 設定教學。
最後一句提醒:這個檔案的風險不對稱。寫得少,最壞的情況是爬蟲多抓了幾個沒必要的網址;寫得多而寫錯,最壞的情況是整站從搜尋結果消失。不確定的時候,少寫。
參考來源
常見問題
網站一定要有 robots.txt 嗎?
不一定。robots.txt 回 404 時,Google 會視為「沒有任何限制」,效果與整站開放相同,所以沒有這個檔案不會造成損害。
真正要避免的是回 5xx:伺服器出錯時 Google 會先停止爬取 12 小時,之後改用最多 30 天的快取版本。如果這個檔案是程式動態產生的,要確認它在後端出錯時不會噴 500。
用 robots.txt 擋掉的頁面,會不會還是出現在搜尋結果?
會。robots.txt 控制的是「要不要爬取」,不是「要不要收錄」。Google 官方文件說明,被 robots.txt 封鎖的網頁仍可能出現在搜尋結果中,例如當其他網頁連結到它時——只是因為沒讀過內容,摘要那一欄會是空的或制式說明。
要讓頁面不出現在搜尋結果,正確做法是允許爬取,然後在頁面放 noindex。
在 robots.txt 裡寫 noindex 有用嗎?
沒有用。Google 於 2019 年 9 月 1 日移除了對 noindex、nofollow、crawl-delay 這幾個未被正式記載的欄位的處理,寫了會被直接忽略。
替代做法依情境選用:允許爬取時用 robots meta 標記或 HTTP 標頭的 noindex(最有效)、用 404 或 410 狀態碼、用密碼保護,或使用 Search Console 的移除網址工具(暫時性)。
要不要擋 GPTBot 這類 AI 爬蟲?
先分清楚兩類。訓練用的爬蟲(GPTBot、CCBot、Google-Extended、Applebot-Extended)擋掉的後果是內容不進訓練資料;即時檢索用的爬蟲(OAI-SearchBot、ChatGPT-User、PerplexityBot)擋掉的後果是 AI 回答問題時不會引用你。
以內容本身為商品的媒體,封鎖有其道理。但對靠被找到來獲客的一般企業,全面封鎖等於主動退出這個管道。如果沒有明確理由,預設開放較合理;真要限制,建議只擋訓練用的那一類。
改了 robots.txt 多久生效?
Google 一般會快取 robots.txt 內容最多 24 小時,所以改完不會立即反映;在無法取得檔案的情況下可能快取更久。
如果需要確認 Google 目前實際讀到的是哪一個版本,可以在 Search Console 檢視,那裡同時會顯示解析結果與語法問題。
技術 SEO 分類其他文章
繼續閱讀同主題的延伸內容
留言討論
只有會員能留言(防止垃圾訊息),留言顯示於此頁。
