摘要
本文詳細說明 Google 如何處理 robots.txt 檔案。robots.txt 檔案可協助您控管 Google 網站檢索器如何檢索可公開存取的網站,以及如何為這類網站建立索引。
異動內容
2019 年 7 月 1 日,Google 宣布要致力讓 robots.txt 通訊協定成為網際網路標準,相關異動現在已反映在本文件中。
基本定義
定義 | |
---|---|
檢索器 | 檢索器是一種用於檢索網站內容的服務或代理程式。一般而言,檢索器會自動且遞迴存取已知的主機網址,其中提供了可透過標準網路瀏覽器存取的內容。發現新的網址時 (可透過各種方式,例如已檢索的現有網頁上的連結,或 Sitemap 檔案) 檢索器也會以同樣的方式檢索這些新網址。 |
使用者代理程式 | 找出特定檢索器或一組檢索器的工具。 |
指令 | robots.txt 檔案中所列出的檢索規定,適用於特定的檢索器或一系列的檢索器。 |
網址 | 統一資源定位器,定義按照 RFC 1738 中所述。 |
Google 的處理方式 | 這些元素是 Google 實作 robots.txt 的特有方式,不一定適用於其他服務。 |
適用性
Google 所有的自動式檢索器均遵照這份文件中所提及的準則運作。代理程式代使用者存取網址時 (例如翻譯、手動訂閱的動態饋給、惡意軟體分析),則無須遵守這些準則。
檔案位置和效力範圍
robots.txt 檔案必須位於主機的頂層目錄中,並可透過適當的通訊協定和通訊埠號碼存取。robots.txt 一般接受的通訊協定均以 URI 為基礎,但如果是 Google 搜尋 (例如網站檢索),則為「http」和「https」。使用 http 和 https 時,系統會透過 HTTP 非條件式 GET 要求來擷取 robots.txt 檔案。
Google 特有的處理方式:Google 同樣接受及採用 FTP 站台的 robots.txt 檔案。FTP 式的 robots.txt 檔案可使用匿名登入,透過 FTP 通訊協定存取。
robots.txt 檔案中所列出的指令僅適用於代管該檔案的主機、通訊協定和通訊埠號碼。
有效 robots.txt 網址範例
Robots.txt 網址範例 | |
---|---|
http://example.com/robots.txt |
有效範圍:
|
http://www.example.com/robots.txt |
有效範圍: 無效範圍:
|
http://example.com/folder/robots.txt |
不是有效的 robots.txt 檔案。檢索器不會檢查子目錄中的 robots.txt 檔案。 |
http://www.müller.eu/robots.txt |
有效範圍:
無效範圍: |
ftp://example.com/robots.txt |
有效範圍: 無效範圍: Google 的處理方式:針對 FTP 資源,我們採用 robots.txt。 |
http://212.96.82.21/robots.txt |
有效範圍: 無效範圍: |
http://example.com:80/robots.txt |
有效範圍:
無效範圍: |
http://example.com:8181/robots.txt |
有效範圍: 無效範圍: |
各種 HTTP 結果碼的處理方式
一般而言,robots.txt 檔案在經過擷取後會產生三種結果:
- 全部允許:可能會檢索所有內容。
- 全部禁止:可能不會檢索任何內容。
- 有條件允許:由 robots.txt 中的指令決定是否檢索特定內容。
各種 HTTP 結果碼的處理方式 | |
---|---|
2xx (successful) (成功) | 這種發出成功訊息的 HTTP 結果碼會產生「有條件允許」的檢索動作。 |
3xx (redirection) (重新導向) | Google 依 RFC 1945 對 HTTP/1.0 的定義,允許至少五個重新導向躍點,然後會停止並判定發生 404 錯誤。Google 不鼓勵處理會導向至受禁止網址的 robots.txt 重新導向;由於尚未擷取任何規則,因此 Google 會採用至少五個重新導向躍點,假使找不到任何 robots.txt,就會判定 robots.txt 發生 404 錯誤。針對以傳回 2xx 代碼的 HTML 內容為基礎的 robots.txt 檔案,Google 不鼓勵處理這類檔案的邏輯重新導向 (頁框、JavaScript 或中繼重新整理類型的重新導向),並會使用第一個頁面的內容尋找適用規則。 |
4xx (client errors) (用戶端錯誤) | Google 會以同樣的方式處理所有 4xx 錯誤,並假設不存在任何有效的 robots.txt 檔案。這種做法會假設沒有任何重新導向。對檢索作業而言,即為「全部允許」。 |
5xx (server error) (伺服器錯誤) | 我們會將伺服器錯誤視為會造成檢索作業「全部禁止」的暫時性錯誤, 也會重試要求,直到取得非伺服器錯誤的 HTTP 結果碼為止。503 (Service Unavailable) (服務無法使用) 錯誤會導致系統相當頻繁地重試。如果 Google 超過 30 天都無法連上 robots.txt,就會使用 robots.txt 的最後一個快取副本。如果找不到快取資料,Google 會假設沒有任何檢索限制。如要暫時停止檢索作業,建議您提供 503 HTTP 結果碼。 Google 的處理方式:如果我們能夠確認網站設定有誤,導致網頁缺漏問題無法正確傳回 404 代碼,而是傳回 5xx 代碼,那麼我們會把該網站傳回的 5xx 錯誤視為 404 來處理。 |
要求失敗或資料不完整 | 對於因為 DNS 或網路問題 (例如逾時、無效的回覆、重設或連線中斷、HTTP 區塊化錯誤等) 而無法擷取的 robots.txt 檔案,系統在處理時會視為發生伺服器錯誤。 |
快取 | 一般而言,robots.txt 內容的快取時間可達 24 小時,但如果發生無法重新整理快取版本的情況,例如逾時或 5xx 錯誤,則快取的時間可能會更長。快取回應可由不同的檢索器共用。Google 可能會依 max-age Cache-Control HTTP 標頭增加或減少快取的效期。 |
檔案格式
檔案格式應為採用 UTF-8 編碼的純文字檔。 檔案中包含由 CR、CR/LF 或 LF 分隔的行。
有效的行才會列入考量;所有其他內容都會遭到忽略。舉例來說,如果結果文件為 HTML 頁面,系統只會將有效的文字行納入考量,並在未顯示警告或錯誤的情況下捨棄其餘部分。
如果使用的字元編碼會導致出現非 UTF-8 子集的字元,系統可能會無法正確剖析檔案內容。
robots.txt 檔案開頭的選用 Unicode BOM (位元組順序標記) 會遭到忽略。
每個有效行都包含一個欄位、一個冒號和一個值。您可選擇是否要使用空格 (但建議使用以改善可讀性)。使用「#」字元就可以在檔案中的任何位置加註;系統會將註解開頭後到行結尾間的所有內容視為註解,並予以忽略。一般格式為 <field>:<value><#optional-comment>
。行開頭和結尾的空白字元會遭到忽略。
<field>
元素無須區分大小寫。<value> 元素有可能須區分大小寫,視 <field> 元素而定。
系統不支援處理含有基本錯誤或錯字的 <field>
元素,例如在元素中使用「useragent」而非「user-agent」。
各檢索器可能會強制規定檔案大小上限。超過檔案大小上限的內容會遭到忽略。Google 目前強制規定的大小上限為 500 KiB。如要縮減 robots.txt 檔案的大小,請整合會導致 robots.txt 檔案過大的指令。例如,您可以將排除的內容放在獨立的目錄中。
正式語法/定義
以下是 RFC 5234 中所述的擴充巴科斯諾爾形式 (ABNF) 說明。
robotstxt = *(group / emptyline) group = startgroupline ; We start with a user-agent *(startgroupline / emptyline) ; ... and possibly more user-agents *(rule / emptyline) ; followed by rules relevant for UAs startgroupline = *WS "user-agent" *WS ":" *WS product-token EOL rule = *WS ("allow" / "disallow") *WS ":" *WS (path-pattern / empty-pattern) EOL ; parser implementors: add additional lines you need (for example, Sitemaps), and ; be lenient when reading lines that don't conform. Apply Postel's law. product-token = identifier / "*" path-pattern = "/" *(UTF8-char-noctl) ; valid URI path pattern; see 3.2.2 empty-pattern = *WS identifier = 1*(%x2d / %x41-5a / %x5f / %x61-7a) comment = "#" *(UTF8-char-noctl / WS / "#") emptyline = EOL EOL = *WS [comment] NL ; end-of-line may have optional trailing comment NL = %x0D / %x0A / %x0D.0A WS = %x20 / %x09 ; UTF8 derived from RFC3629, but excluding control characters UTF8-char-noctl = UTF8-1-noctl / UTF8-2 / UTF8-3 / UTF8-4 UTF8-1-noctl = %x21 / %x22 / %x24-7F ; excluding control, space, '#' UTF8-2 = %xC2-DF UTF8-tail UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / %xF4 %x80-8F 2( UTF8-tail ) UTF8-tail = %x80-BF
行和規則的分組方式
每個群組為一或多個 user-agent
行,後接一或多項規則。如果出現另一個 user-agent
行或到了檔案結尾,即表示群組結束。最後一個群組可能沒有任何規則,等於允許所有內容。
群組範例:
user-agent: a disallow: /c user-agent: b disallow: /d user-agent: e user-agent: f disallow: /g user-agent: h
這裡指定了四個不同的群組:
- 一個「a」群組
- 一個「b」群組
- 一個包含「e」和「f」的群組
- 一組「h」群組
除了最後一個群組 (群組「h」) 以外,每個群組都有自己的群組成員行。最後一個群組 (群組「h」) 為空白。請注意,您可以選擇使用空白字元和沒有內容的空行來改善可讀性。
使用者代理程式的優先順序
對於某個特定的檢索器而言,只有一個群組會生效。檢索器必須找出檢索條件最詳細且使用者代理程式依然相符的群組,並將其判斷為正確的行群組。所有其他群組都會遭到檢索器忽略。使用者代理程式的名稱須區分大小寫,所有不相符的文字都會遭到忽略,例如 googlebot/1.2
和 googlebot*
均等同於 googlebot
。robots.txt 檔案中的群組順序與此並沒有關聯性。
如果對特定的使用者代理程式宣告多個群組,系統會將該使用者代理程式適用群組中的所有規則合併為單一群組。
範例
範例 1
假設 robots.txt 檔案的設定如下:
user-agent: googlebot-news (group 1) user-agent: * (group 2) user-agent: googlebot (group 3)
以下說明檢索器如何決定相關的群組:
各檢索器採用的群組 | |
---|---|
Googlebot 新聞 | 採用的群組為群組 1。只會採用檢索條件最詳盡的群組,所有其他群組都會遭到忽略。 |
Googlebot (網路) | 採用的群組為群組 3。 |
Googlebot 圖片 | 採用的群組為群組 3。由於沒有特定的 googlebot-images 群組,因此會採用較通用的群組。 |
Googlebot 新聞 (檢索圖片時) | 採用的群組為群組 1。Googlebot 新聞本身會針對這些圖片執行檢索,因此只採用 Googlebot 新聞群組。 |
Otherbot (網路) | 採用的群組為群組 2。 |
Otherbot (新聞) | 採用的群組為群組 2。即使有項目適用於相關的檢索器,也只有在檢索條件相符時才會生效。 |
範例 2
假設 robots.txt 檔案的設定如下:
user-agent: googlebot-news disallow: /fish user-agent: * disallow: /carrots user-agent: googlebot-news disallow: /shrimp
檢索器會以下列方式合併與特定使用者代理程式相關的群組:
user-agent: googlebot-news disallow: /fish disallow: /shrimp user-agent: * disallow: /carrots
另請參閱 Google 檢索器和使用者代理程式字串。
Group-member 規則
本節僅涵蓋標準 group-member 規則。這些規則也稱為檢索器的「指令」。這些指令是以 directive:
[path]
的形式來指定,其中 [path]
為選用部分。根據預設,指定的檢索器並沒有任何檢索限制。沒有 [path]
的指令會遭忽略。
在擷取網站的 robots.txt 檔案時 (使用同樣的通訊協定、通訊埠號碼、主機和網域名稱),[path]
值 (如有指定) 會視為與網站的根目錄相對。路徑值的開頭必須為「/」才能指定根目錄。路徑有大小寫之分。詳情請參閱下方的「以路徑值為基準的網址比對」一節。
disallow
disallow
指令會指明不得由指定檢索器存取的路徑。如未指定路徑,這個指令會遭到忽略。
使用方式:
disallow: [path]
allow
allow
指令會指明可由指定檢索器存取的路徑。如未指定路徑,這個指令會遭到忽略。
使用方式:
allow: [path]
以路徑值為基準的網址比對
如要指定是否要將某個規則套用在網站的特定網址上,可將路徑值做為基準。除了萬用字元以外,路徑會用來比對網址的開頭 (以及任何以同樣路徑開頭的有效網址)。如果路徑中有非 7 位元 ASCII 字元,系統可能會按照 RFC 3986,將其視為 UTF-8 字元或百分比逸出的 UTF-8 編碼字元並加入路徑中。
Google、Bing 和其他主流搜尋引擎只支援特定形式的路徑值「萬用字元」。這些形式包括:
*
代表 0 或更多的任一有效字元例項。$
代表網址結尾。
路徑比對範例 | |
---|---|
/ |
比對根目錄以及所有層級較低的網址 |
/* |
等同於 / 。結尾的萬用字元會遭到忽略。 |
/fish |
相符:
不相符:
|
/fish* |
等同於 相符:
不相符:
|
/fish/ |
結尾的斜線代表比對這個資料夾中的所有項目。 相符:
不相符:
|
/*.php |
相符:
不相符:
|
/*.php$ |
相符:
不相符:
|
/fish*.php |
相符:
不相符: |
Google 支援的 non-group-member 行
Google、Bing 和其他主流搜尋引擎均支援 sitemaps.org 定義下的 sitemap
。
使用方式:
sitemap: [absoluteURL]
[absoluteURL]
會指向 Sitemap 或 Sitemap 索引檔案的位置,必須使用包括通訊協定和主機的完整網址,且不必經過網址編碼處理。該網址所在的主機無須與 robots.txt 檔案相同。可以有多個 sitemap
項目存在。就如同 non-group-member 行,這些項目不會綁定到任何特定的使用者代理程式,只要未遭到禁止,所有檢索器都可能採用。
範例
user-agent: otherbot disallow: /kale sitemap: https://example.com/sitemap.xml sitemap: https://cdn.example.org/other-sitemap.xml sitemap: https://ja.example.org/テスト-サイトマップ.xml
group-member 行的優先順序
在 group-member 層級,特別是對 allow
和 disallow
指令而言,如果參照的規則是以 [path]
項目長度為基準,那麼檢索條件最詳盡的規則,會優先於檢索條件較不詳盡 (較短) 的規則。如果規則發生衝突 (包括含有萬用字元的規則),則會使用限制最少的規則。
情況範例 | |
---|---|
http://example.com/page |
認定結果: |
http://example.com/folder/page |
認定結果: |
http://example.com/page.htm |
認定結果: |
http://example.com/ |
認定結果: |
http://example.com/page.htm |
認定結果: |
測試 robots.txt 標記
Google 提供兩種測試 robots.txt 標記的方式:
- Search Console 中的 robots.txt 測試工具。
- Google 的開放原始碼 robots.txt 程式庫,這同時也是 Google 搜尋使用的程式庫。