網站正常,Favicon 卻在 SERP 顯示灰色地球?GSC Sitemap Couldn’t Fetch 問題診斷紀實

favicon & sitemap 問題診斷紀實文章封面圖

網站在瀏覽器看起來一切正常,Chrome 瀏覽器分頁上的 Favicon 顯示新版圖片,在瀏覽器的網址列輸入 sitemaps.xml,也能正常顯示內容。但 Google SERP 上的品牌圖示卻是一顆灰色地球,GSC 的 Sitemap 報表還掛著 Couldn’t fetch。

這是 Good Vibe 好感數位整合官網真實遇到的狀況:你看到的網站跟 Google 看到的網站,不是同一個版本。

這篇文章記錄了我們針對這 2 個問題進行的完整問題診斷。

先講核心答案:這類問題多半不是單一設定壞掉,而是訊號在網站輸出、資源傳遞、Crawler 存取、Google 內部處理、GSC / SERP 顯示這 5 層架構的某一層出現不一致。正確做法不是急著改設定,而是先保存現場,一步一步依照每一層驗證、每一層都拿到可以證明的證據,確認資料乾淨之後就停止異動,把剩下的時間留給 Google 的處理週期。

為什麼值得花時間處理?

Favicon 雖然不是 Google 已確認的排名因素,但它是使用者在搜尋結果與 AI 回答引用來源時,是協助使用者識別品牌的重要資產。使用者掃過 SERP 或 AI Overview 的引用清單時,一顆灰色地球與一個清楚的品牌 logo 圖示,給人的專業度感受完全不同,這也會影響點擊與進站意願。

Sitemap 問題的影響在於:如果 Sitemap 真的長期無法被抓取,Google 發現新頁面與內容更新的效率會下降,索引時程可能被拉長,而沒有進入索引的頁面,不會出現在傳統搜尋結果,也可能降低在搜尋型 AI 功能中被引用的機會。

讀完這篇文章的讀者們可以了解以下 10 大方向:

排查前準備:保存現場、看懂 2 個常被忽略的訊號,以及 5 層排查順序

favicon,sitemap,favicon 沒顯示,sitemap couldn't fetch
  • 本段目標:在動手修改任何設定之前,先建立可比對的基準狀態,看懂 HTTP Status 與 Content-Type 這 2 個判讀關鍵,並定義整篇文章依循的排查順序。

動手改之前,先保存這些畫面

排查最常見的錯誤,是發現問題後立刻開始改設定。改了之後,原始現場就消失了:你再也無法確認哪些異常是原本就存在、哪些是自己改出來的,後續就算狀況好轉,也說不出是哪個動作起了作用。所以第一步是唯讀的,只記錄,不更動!

Good Guy 編覺得這是整次排查裡投資報酬率最高的一步,除了時間成本外,幾乎沒有其他成本,卻決定了後面每一個判斷有沒有依據。

建議保存的內容:

  • Google SERP 的實際顯示畫面,桌機 & 手機都截。
  • GSC Sitemap 報表畫面,包含狀態與 Last read 日期。
  • 首頁完整原始碼,存成檔案,不是只用眼睛看過。
  • Favicon 圖片 URL 的回應內容與 HTTP Header。
  • Sitemap URL 的回應內容與 HTTP Header。
  • 第三方檢測工具的結果畫面,即使各家說法不一致也儲存。

當時我們在 Good Vibe 好感數位整合官網保存下來的現場,矛盾得很有代表性:

  • Chrome 瀏覽器分頁:正常顯示新版 Favicon。
  • Google SERP:品牌搜尋結果顯示灰色地球。
  • sitemaps.xml:瀏覽器直接打開完全正常。
  • GSC Sitemap 報表:狀態顯示 Couldn’t fetch。
  • 第三方 Favicon 檢測工具:有的判定正常,有的建議刪檔重做。
favicon,sitemap,favicon 沒顯示,sitemap couldn't fetch
favicon,sitemap,favicon 沒顯示,sitemap couldn't fetch

第 2 張截圖還有一個值得注意的細節:同一組搜尋結果裡,品牌關鍵字已經觸發 AI Overview,代表 Google 對品牌有一定程度的理解,但 Favicon 依然顯示異常,這同時也說明 Favicon 顯示與整體 SEO 健康度,是 2 件可以分開判斷的事,不需要因為一顆灰色地球就懷疑整個網站的體質。

HTTP Status 與 Content-Type,可以怎麼觀察?

排查會反覆出現 2 個訊號,重點如下:

HTTP Status 是伺服器對每個請求的回覆代號:200 代表成功拿到內容,301 / 302 代表被轉往其他位置,404 代表找不到,5xx 代表伺服器自己出錯。

Content-Type 則是內容的身分證,說明拿到的東西是什麼格式:圖片應該是 image/pngimage/x-icon 這類,XML 應該是 application/xml or text/xml,網頁才是 text/html

最容易被忽略的異常組合是:狀態碼 200,Content-Type 卻是 text/html。表面上請求成功了,實際上拿到的是一張網頁,不是圖片,也不是 XML。常見原因是 URL 被轉址回首頁,or 伺服器用一張自訂錯誤頁回應。對使用者的瀏覽體驗來說這只是打開一個網頁,對 Google 的系統來說,這代表你宣告的 Favicon or Sitemap 位置,給出來的是完全錯誤的內容型態。我們這次排查中,有好幾個關鍵問題,都是靠這個組合才被發現

5 層排查順序

為了不讓排查變成亂試一通,整篇文章依照同一個順序推進,我們把它叫做 5 層排查順序:

  1. 網站輸出層:網站本身送出的 HTML、Favicon 檔案、Sitemap XML 對不對。
  2. 資源傳遞層:CDN、快取、防盜鏈這些中間層,會不會讓不同請求看到不同版本。
  3. Crawler 存取層:Googlebot 是不是真的抓到了,而且是真的 Googlebot。
  4. Google 內部處理層:Google 抓到之後怎麼比對、快取、決策。這層外部看不到,只能依證據推測。
  5. GSC / SERP 顯示層:Google 決定要不要、什麼時候把結果呈現出來。

前 3 層你可以直接驗證,第 4 層只能推論,第 5 層只能觀察等待。排查原則因此很清楚:把自己能控制的前 3 層逐層拿到證據,確認乾淨之後停手,剩下的交給 Google 的處理週期。

要不要用 CDN?資源傳遞層的決策與最容易誤傷爬蟲的設定

favicon,sitemap,favicon 沒顯示,sitemap couldn't fetch

本段目標:在檢查任何技術細節之前,先判斷這個網站到底需不需要 CDN,以及如果要用,哪個設定最容易在不知不覺間擋住 Google 爬蟲?

要不要用 CDN?先想清楚幾個問題

很多品牌把 CDN 當成「網站要做好一定要有」的標配,但 Good Guy 編覺得這個判斷順序反了。CDN 解決的核心問題是地理距離造成的延遲:使用者離你的伺服器越遠,內容經過 CDN 節點快取後回傳的速度優勢就越明顯。這代表它的價值高低,取決於你的商業模式是否涵蓋台灣以外的市場

可以先問自己以下幾個問題:

  1. 服務範圍是不是跨境?

    • 如果只服務台灣市場,使用者跟伺服器的地理距離本來就不遠,CDN 縮短延遲的價值會打折。
  2. 網站流量規模夠不夠大?

    • 流量不大的網站,CDN 在分擔頻寬與邊緣快取上能帶來的效益也有限,這部分紅利跟規模是綁在一起的。
  3. CDN 服務商在台灣或鄰近地區有沒有節點?

    • 這點常被忽略,如果選用的服務沒有鄰近節點,使用者的請求得先繞去比較遠的邊緣點,才能再轉回你的原始伺服器,多這一次跳轉,效能反而可能比不用 CDN 還差。

這不代表 CDN 沒有其他價值,資安防護、DDoS 緩解、TLS 終止這些功能跟地理延遲無關,即使上述 3 個條件都不成立,這些效益還是存在。

簡單來說是:當服務範圍集中、流量不大、又沒有鄰近節點的時候,CDN 縮短延遲這個價值會明顯打折!當然,如果是為了讓網站加上一層保護,那就另當別論,CDN 是個解決方案沒錯!

如果評估下來確定要用 CDN,這裡有一個 Good Guy 編認為最容易在不知不覺間造成問題的設定:Hotlink Protection (防盜鏈保護)

它的運作原理是檢查請求帶的 Referer Header,也就是「這個請求是從哪個頁面連過來的?」這項資訊是用來判斷請求是否來自自己的網站?若是就放行,來源不明或來自別的網站就擋下來,防止別人直接盜用你的圖片流量。

問題出在部分圖片請求可能不帶 Referer Header。如果 Hotlink Protection 的規則是「沒有 Referer 就一律擋下來」,就有機會連帶擋到直接請求、部分工具 or Crawler,這就有機會影響 Favicon 被 Googlebot 抓取。

好消息是,多數主流 CDN 的 Hotlink Protection 功能都設計了排除機制,可以另外設定「允許空 Referer 的請求通過」,或是直接提供「允許主流搜尋引擎爬蟲」的白名單選項。問題通常出在這些排除設定沒有被打開,不是這個防護功能本身有害。如果你的網站已經開了 Hotlink Protection,Good Guy 編會建議直接檢查一次這個排除清單,而不是假設它已經幫你排除好了。

Favicon 網站輸出到底送出了什麼

favicon,sitemap,favicon 沒顯示,sitemap couldn't fetch

需要檢查哪些層面?

  • 首頁本身是不是回應 200?
  • 首頁的 <head> 裡有沒有有效的 rel="icon" 宣告?
  • Favicon URL 打開後,是不是真的回傳圖片?
  • 狀態碼與 Content-Type 是否正確?尤其是 200 但 Content-Type 卻是 text/html 這個組合。
  • 有沒有不必要的 Redirect?
  • 圖片尺寸跟宣告的 sizes 屬性是否一致?
  • robots.txt 有沒有擋到首頁或圖片所在目錄?
  • 舊版 Favicon URL 最終導向的是有效圖片,還是網頁?
  • 一般請求跟模擬 Googlebot-Image 的請求,拿到的內容是不是一致?
  • 快取會不會讓不同請求看到不同版本?

為什麼是這些層面?

正確的 Favicon 資料索取路徑長這樣:

  1. 首頁回應 200。
  2. <head> 裡的 <link rel="icon"> 指向一個穩定的 URL。
  3. 這個 URL 回應 200、Content-Type 正確。
  4. 內容真的是圖片、尺寸跟宣告一致。
  5. 不管是一般瀏覽器還是 Googlebot-Image 打這個 URL,拿到的都是同一份圖檔。

資料索取路徑有誤通常會出現在某個環節:

  1. Declaration 指向的 URL 其實已經失效。
  2. 圖片被轉址到別的地方。
  3. Content-Type 標示為圖片,實際內容卻是網頁。
  4. robots.txt 不小心把圖片目錄整個擋掉了。

每一個環節斷掉,呈現出來的症狀都很像,都是「Favicon 不見了」,但修復的動作完全不同,要照順序逐一驗證。

排查的細節與 CLI 指令

執行以下指令時需將目標 URL (example.com) 改為品牌官網實際的網址

curl -sL -o /dev/null -w 'final_url=%{url_effective}\nhttp_code=%{http_code}\ncontent_type=%{content_type}\n' https://example.com/

這個指令會告訴你 3 件事:

  1. 最終停在哪個 URL (有沒有被轉址)。
  2. HTTP 狀態碼。
  3. 實際的 Content-Type。

檢查首頁狀態

curl -sL -o /dev/null -w 'final_url=%{url_effective}\nhttp_code=%{http_code}\ncontent_type=%{content_type}\n' https://example.com/

正常結果:

  1. http_code=200
  2. content_type=text/html
  3. final_url 跟你打的網址一致,沒有被轉去其他網域 or 路徑。

檢查 Root Favicon

curl -sL -o /dev/null -w 'final_url=%{url_effective}\nhttp_code=%{http_code}\ncontent_type=%{content_type}\n' https://example.com/favicon.ico
curl -sL -o /dev/null -w 'final_url=%{url_effective}\nhttp_code=%{http_code}\ncontent_type=%{content_type}\n' https://example.com/favicon.png

正常結果:

  1. 兩者都回應 200。
  2. Content-Type 是 image/x-icon or image/png 這類圖片格式,不是 text/html

下載檔案確認實際類型與尺寸

curl -sL -o favicon-check.png https://example.com/favicon.png
file favicon-check.png

file 指令會直接告訴你這個檔案真正的格式跟尺寸 e.g. PNG image data, 192 x 192。這一步很重要,因為 URL 的副檔名跟 Content-Type Header 都可能造假 or 設定錯誤,只有實際下載下來檢查內容,才是最終依據。這一步同時完成了「確認實際類型」跟「檢查圖片尺寸」2 件事。

檢查舊 Favicon Redirect 最終導向

curl -sL -o /dev/null -w 'final_url=%{url_effective}\nhttp_code=%{http_code}\ncontent_type=%{content_type}\n' https://example.com/old-favicon-path.png

如果網站之前換過 Favicon 檔名 or 路徑,應先確認舊 URL 是否仍被首頁引用、外部使用,or 是否還有 Crawler 存取紀錄。

如果舊 URL 仍有明確使用證據,可以將它 301 精準導向有效的新圖片;如果已經沒有引用與存取需求,回應 404 or 410 也不一定是問題。

真正應避免的是把舊圖片 URL 導回首頁,最後形成 200 + text/html:表面上請求成功,實際拿到的卻不是圖片。

檢查 robots.txt

curl -s https://example.com/robots.txt

檢查裡面有沒有 Disallow 規則不小心擋到圖片或媒體檔案所在的目錄。以常見的 WordPress 網站為例,圖片通常放在 /wp-content/uploads/ 這個路徑下,如果 robots.txt 誤將這個目錄整個 Disallow,Favicon 圖片就算網站端一切正常,Googlebot 也拿不到。其

他網站系統的原理相同,只是媒體檔案的目錄路徑不同,重點是找到你自己網站實際存放圖片的目錄,確認它沒有被整個擋掉。

比較一般請求與模擬 Googlebot-Image 請求

curl -sL -o /dev/null -w 'http_code=%{http_code}\ncontent_type=%{content_type}\n' https://example.com/favicon.png
curl -sL -A "Googlebot-Image/1.0" -o /dev/null -w 'http_code=%{http_code}\ncontent_type=%{content_type}\n' https://example.com/favicon.png

2 次結果應該完全一致。如果不一致 e.g. 一般請求拿到圖片,模擬 Googlebot 的請求卻拿到別的內容,代表資源傳遞層 (CDN、快取、防盜鏈其中之一) 用某種規則區分了不同的請求來源,這時候要回頭檢查上一個章節提到的 CDN 與 Hotlink Protection 設定。

要注意的是,這裡只是「模擬」UA,不是真的證明 Googlebot 有沒有來過,那是後面 Crawler 存取層要處理的事。

根目錄要不要另外放 /favicon.ico 與 /favicon.png?

答案是:不是 Google 官方硬性規定。Google 官方文件只要求首頁 <head><link rel="icon"> 標籤指向 Favicon URL,並沒有規定這個檔案一定要放在網站根目錄。

但這是被廣泛採用的技術慣例,原因是不少瀏覽器、工具、RSS Reader 或連結預覽機制,在沒有讀到 <link> 標籤的情況下,會自動嘗試打根目錄的 /favicon.ico

所以在根目錄放一份穩定的檔案,可以降低不同用戶端的判讀落差,也能避免這些自動請求打到不存在的路徑而產生無謂的 404。這也是我們這次排查後認定「有明確價值」的重要修正項目之一。

32 × 32 Favicon 要不要移除?SVG or Manifest 是否必須?

先講會讓人卡關的地方:部分第三方 Favicon 檢測工具會直接標示 32×32 尺寸「太小」,建議刪除。Good Guy 編覺得這個建議要謹慎採納,因為常見網站系統(e.g. WordPress)的原生 Favicon 產生流程,本來就會同時輸出 32×32 與 192×192 這 2 種尺寸,這是正常的多尺寸供應,不是設定錯誤,不需要為了迎合單一工具的意見而特地移除。

真正該關注的重點不是尺寸,是這些 URL 有沒有保持穩定。反覆更換路徑、刪除又重建,才是真正容易讓 Google 端訊號混亂的原因。

SVG 或 Manifest 呢?直接答案:不是 Google SERP Favicon 的已確認必要條件。這兩者可以改善跨平台的完整性 (e.g. PWA 情境),但如果現階段還有更基礎的問題沒排除,Good Guy 編會建議優先處理下面這幾件事,而不是急著補齊格式:

  • 圖片 URL 回傳的其實是 HTML。
  • Content-Type 跟實際檔案格式不一致。
  • 不必要的 Redirect。
  • robots.txt 擋住圖片目錄。
  • Declaration 跟實際檔案內容不一致。

完成哪些調整後停止異動?

為了避免持續製造新的變因,Good Guy 編建議用以下 7 點作為停止異動的判斷標準:

  1. Root Favicon 直接回傳正確圖片,不是網頁。
  2. Content-Type 跟圖片格式一致。
  3. 不必要的 Redirect 已清除。
  4. 舊圖片 URL 已導向有效的新圖片。
  5. 首頁的 Declaration 跟實際檔案內容一致。
  6. robots.txt 沒有擋到首頁或圖片目錄。
  7. URL 保持穩定,不再更換。

完成以上 7 項之後,就不要再更換 Root Favicon、刪除 32×32、追加不必要的格式,或反覆按 Request Indexing。沒有被引用、沒有錯誤回應、也沒有 Crawler 存取證據的歷史圖片,也不需要為了「全部清乾淨」而任意刪除或轉址,那只會製造新的變因,讓下一輪排查更難判斷。

Sitemap 明明可以開啟,為什麼 GSC 顯示 Couldn’t fetch?

favicon,sitemap,favicon 沒顯示,sitemap couldn&#039;t fetch

本段目標:說明「瀏覽器打得開」不等於「GSC 判定正常」,並提供一套層層排除的檢查順序,讓你能明確判斷問題到底出在自己的網站?還是在 Google 那一端?

這次排查裡最違反直覺的訊號衝突為:sitemaps.xml 用瀏覽器直接打開,內容完整、格式正常,但 GSC 的 Sitemap 報表卻長期顯示 Couldn’t fetch,連 Last read 日期都停在很久以前。

這 2 個畫面不一定互相矛盾。瀏覽器顯示的是當下這次請求的結果;GSC 顯示的則是 Google 最近一次處理該 Sitemap 時的狀態。網站可能曾經暫時抓取失敗,之後才恢復正常。

Google 官方列出的 Couldn’t fetch 成因包含:robots.txt 封鎖、未解決的 Manual Action、提交 URL 錯誤、伺服器暫時無法使用、其他一般抓取錯誤,以及 Sitemap 的 Crawl Demand 過低。

因此,看到 Couldn’t fetch 時不能立刻斷定是 Google 報表延遲,也不需要直接重做 Sitemap。應先確認 GSC 提交 URL、網站回應與 Google Live Test,再用 Server Log or Crawl Stats 判斷 Google 是否已經成功抓取。

需要排查哪些層面?

  1. Main Sitemap 的 HTTP Status 與 Content-Type。
  2. XML 內容本身是否有效,開頭有沒有被混入其他內容。
  3. 有沒有 Redirect,最終 URL 跟提交給 GSC 的 URL 是否一致。
  4. Child Sitemap 是否每一條都正常回應。
  5. robots.txt 裡的 Sitemap 宣告是否指向正確 URL。
  6. Google 是否有實際抓取的證據 (這一項留到下一個章節用 Server Log 驗證)。

為什麼是這些層面?

Sitemap 的判定鏈路比 Favicon 單純,但斷點更隱蔽。Google 抓 Sitemap 時,拿到的必須是狀態碼 200、Content-Type 為 XML 類型、內容從第一個字元開始就是合法 XML 的回應。在以下 3 點任何一個環節不乾淨,都可能讓抓取端判定失敗:

  1. 瀏覽器通常很寬容,就算 Content-Type 標錯、開頭混入一行空白 or 錯誤訊息,它還是會盡力把 XML 渲染出來給你看,所以「打得開」的參考價值有限。
  2. Sitemap 常見採用 Index 結構,Main Sitemap 底下掛多個 Child Sitemap。Main 正常但某條 Child 回應異常,整體判定就可能不一致。
  3. 提交給 GSC 的 URL 如果跟實際最終 URL 之間隔了一層 Redirect,也可能造成判定與預期不符。

把這些層面逐一驗證完,你手上就有一份完整的證據:網站端輸出正常。這份證據的價值在後面會顯現,它是你判斷「該繼續修網站,還是該停手等待」的依據。

排查的細節與 CLI 指令

繼續沿用同一組萬用回應檢查指令,只換 URL。Main Sitemap 的路徑依產生方式而異,常見如 /sitemap.xml/sitemap_index.xml or /sitemaps.xml,以下用 /sitemaps.xml 示範,請換成你自己網站實際的路徑。

檢查 Main Sitemap Response

執行以下指令時需將目標 URL (example.com) 改為品牌官網實際的網址

curl -sS -o /dev/null -w 'url=%{url_effective}\nhttp_code=%{http_code}\ncontent_type=%{content_type}\nredirect_url=%{redirect_url}\n' https://example.com/sitemaps.xml

正常結果:http_code=200redirect_url 為空、content_type 包含 application/xml or text/xml

這裡刻意不加 -L。Google 官方文件在 Sitemaps report 的 Sitemap URL 欄位說明中寫著不會跟隨 Redirect,你要看的是提交網址的原始回應。若拿到 301 or 302,直接把 redirect_url 指到的網址重新提交 GSC。

-sS 不用 -s-s 會把錯誤訊息一起關掉,指令貼錯時你只會看到一片空白。

Content-Type 是 sitemaps.org 慣例,Google 官方並沒有把它列為必要條件 or Couldn't fetch 的原因。設對是好習慣,但它正確不代表 Google 一定收得下。

查看 XML 前幾行

curl -sS https://example.com/sitemaps.xml | head -c 500

確認開頭沒有 HTML、PHP Warning or 其他程式意外輸出,根元素是 <sitemapindex> or <urlset>。用 head -c 而非 head -5,是因為部分產生器會把整份 XML 壓成單行。

輸出結尾若出現一個 %,那是 zsh 提示這段沒有換行字元,不是錯誤。

若這裡看到 <!DOCTYPE html>,代表這個路徑回的是網頁。這種情況 GSC 通常顯示為解析錯誤而不是 Couldn't fetch,屬於另一類問題。

逐條檢查 Child Sitemap

for u in $(curl -sS https://example.com/sitemaps.xml | grep -o '<loc>[^<]*</loc>' | sed -e 's/<[^>]*>//g'); do curl -sS -o /dev/null -w "%{http_code}  %{content_type}  $u\n" "$u"; done

grep -o 會連 <loc> 標籤一起帶出來,接 sed 去掉標籤才是可用的網址。迴圈會把清單與檢查結果一次列出。

通過標準是每條都回 200,Content-Type 包含 application/xml or text/xml。副檔名為 .xml.gz 時回 application/gzip or application/x-gzip 屬正常。

需要處理的有 3 種:404 or 410 代表項目已不存在;轉址到首頁 or HTML 頁面代表這條已失效;轉址到其他網域會直接被判定無效,Sitemap 的網址必須與檔案本身同一主機。

檢查 robots.txt 的 Sitemap 宣告

curl -sS https://example.com/robots.txt

看兩件事:宣告的網址與提交給 GSC 的一致,以及沒有任何 Disallow 規則擋到 Sitemap 路徑。Google 官方把 robots.txt 阻擋列為 Couldn't fetch 的第一個可能原因。

已經有 Sitemap Index 時,robots.txt 只需要宣告 Index 一行。Index 已經指向所有 Child,重複列出只會讓兩份清單有機會不同步。

用 Googlebot 的身分再測一次

curl -sS -o /dev/null -w 'http_code=%{http_code}\ncontent_type=%{content_type}\n' -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://example.com/sitemaps.xml

curl 是從你的電腦、你的 IP 與 UA 發出的請求,Googlebot 不是。結果若與前面不同 (403、503 or 回傳 HTML),問題就鎖定在 WAF、CDN or 主機防火牆的 crawler 處理,跟 Sitemap 本身無關。

請整條複製指令,不要自行換行。若貼成單行,請移除行尾反斜線 \,否則可能造成參數黏在一起。for 迴圈的 done 前也要加分號,否則終端機會停在 for> 等待後續輸入。

Good Vibe 好感數位整合的實測結果

這套流程在自己的網站上跑過一輪,抓取層的結果很乾淨:

  • Main Sitemap 回 200。
  • 無 Redirect。
  • 5 條 Child Sitemap 全部 200 且 Content-Type 正確。
  • 改用 Googlebot UA 再測一次結果一致。

問題出在一致性!

robots.txt 宣告了 4 條 Child Sitemap,Sitemap Index 裡卻有 5 條,少的那條是作者彙整頁的 Sitemap。兩個來源給 Google 的清單不一樣,而且不會有任何工具報錯。

再往下確認,那條 author.xml 裡只裝了 1 條網址,就是作者彙整頁。它回 200、明確列在 Sitemap 裡,頁面本身卻掛著 noindex。Sitemap 的意思是「這些頁面我希望 Google 知道」,noindex 的意思是「別收錄」。

這是 SEO 外掛的預設值。多數外掛預設把作者彙整頁設為 noindex,理由是單一作者網站的作者頁會與部落格列表重複。這個預設在多數情況下是對的,但 Good Vibe 好感數位整合的作者頁有獨立內容,預設值就跟實際策略沒有對齊。

解決方案是到 SEO 外掛裡把作者彙整頁的 noindex 關閉就好!

Good Guy 編要提醒的是:這幾件事都不會出現在任何錯誤報告裡。GSC 不報錯,指令檢查全過,只有把 robots.txt、Sitemap 內容、頁面索引設定與網站導覽結構放在一起看,才會發現各邊在講不同的話。排查不能停在「指令都回 200」。

完成哪些調整後停止異動?

  1. Main Sitemap 回應 200、Content-Type 正確、無 Redirect。
  2. 開頭是合法的 XML,不是網頁。
  3. 所有 Child Sitemap 逐條回應正常,無效項目已移除 or 明確處理。
  4. robots.txt 宣告與提交網址一致,且沒有規則擋到 Sitemap 路徑。
  5. Googlebot UA 對照結果與一般請求相同。

使用 URL Inspection Live Test 驗證

除了 CLI,也要把 GSC 中實際提交的完整 Sitemap URL 貼進 URL Inspection,執行 Live Test。

favicon,sitemap,favicon 沒顯示,sitemap couldn&#039;t fetch
favicon,sitemap,favicon 沒顯示,sitemap couldn&#039;t fetch

Live Test 成功只能證明 Google 的檢查工具當下可以取得這個 URL,不代表 Sitemap 報表會立刻更新,也不保證 Sitemap 中的所有頁面都會被抓取 or 索引。

到這一步,網站端能做檢查與設定都做完了。如果 GSC 仍然顯示 Couldn’t fetch,不要急著重做 Sitemap、換檔名 or 反覆刪除重新提交,這些動作不會加速 Google 端更新,反而會把好不容易穩定下來的訊號再次打亂。

Good Guy 編的判斷是:這個時間點該做的是往下一層走,去確認 Google 是否實際來抓過,而不是繼續在網站端加工。

Google 到底有沒有抓到?如何證明抓取者是真 Googlebot

favicon,sitemap,favicon 沒顯示,sitemap couldn&#039;t fetch

本段目標:說明為什麼 User-Agent 不能當證據,示範 Google 官方認可的 2 種驗證方式,並分享這次排查中真正把證據鏈閉合起來的第一手驗證片段。

前面 2 個章節處理的都是「網站有沒有把東西送對」,這一章要回答的是另一個問題:Google 有沒有真的來拿?這是整條證據鏈裡最關鍵、也最常被跳過的一環,因為多數人只看 GSC 報表,但報表顯示有延遲的可能,Server Log 才是第一手紀錄!

需要排查哪些層面?

  • Server Log 裡有沒有出現抓取 Favicon 與 Sitemap 的請求紀錄。
  • 這些請求的來源,是真的 Googlebot,還是偽裝的爬蟲。
  • GSC 端的抓取紀錄,跟 Server Log 能不能互相對得起來。

為什麼只看 User-Agent 不夠?

Server Log 裡每一筆請求都會帶 User-Agent 字串,看到 Googlebot-Image/1.0 很容易直接當成 Google 來過的證據,但 User-Agent 是請求方自己宣告的,任何人都可以偽造,市面上大量的爬蟲、SEO 工具、內容抓取程式都會掛著 Googlebot 的名字來訪。

把這些請求誤認成真的 Googlebot,你會有「Google 已經抓到了」的錯覺,然後在錯誤的前提上做後續判斷。

反過來說,你自己用 curl 模擬 Googlebot 的 UA 測試網站,那些請求也會出現在 Log 裡。如果沒有驗證機制,連自己的測試流量都會被自己誤判成 Google 的抓取紀錄。

兩種官方驗證方式

Google 官方提供 2 種驗證方向:

  1. 少量、單次查詢:使用 Reverse DNS + Forward DNS。

  2. 大量 or 自動化查詢:比對 Google 官方公布的 IP Ranges JSON。

方法一:Reverse DNS + Forward DNS

先從 Server Log 取得來源 IP,將下方的 CRAWLER_IP 替換成實際來源 IP,再執行 Reverse DNS:

host "CRAWLER_IP"

如果要驗證 Googlebot or Googlebot-Image,查到的 hostname 應以 .googlebot.com 結尾,例如:

  1. crawl-...googlebot.com

  2. geo-crawl-...geo.googlebot.com

接著把查到的 hostname 再做 Forward DNS:

host "crawl-xx-xx-xx-xx.googlebot.com"

解析結果必須包含原本的來源 IP。Reverse DNS 與 Forward DNS 2 段都吻合,才能確認請求確實來自 Googlebot 的網路來源。

User-Agent 可以協助判斷 Crawler 類型,但不能單獨證明請求真的來自 Google。

方法二:比對 Google 官方 IP Ranges JSON 清單

Google 官方公開了 Common Crawlers 使用的 IP 範圍清單

如果要驗證 Googlebot or Googlebot-Image,需確認 Server Log 裡的來源 IP 是否落在 Common Crawlers 清單中的 IPv4 or IPv6 CIDR 網段。

要注意的是,JSON 不會逐筆列出所有 IP,因此不能只搜尋完整 IP。比對結果吻合後,再搭配 User-Agent 判斷該筆請求是哪一類 Common Crawler。

這份清單會持續更新,查核時應重新取得最新版本。

用 GSC 對照:不只靠 CLI

如果你沒有 Server Log 的存取權限,GSC 本身也有一條可以走的路:Settings → Crawl stats,把請求類型篩選到 Image,就能看到 Googlebot-Image 實際抓取過哪些圖片 URL、回應狀態與時間。Favicon 檔案有沒有被抓過、回應是不是 200,這裡直接看得到。

但這裡也必須補充說明,Crawl Stats 顯示的 URL 並不完整。某個 Favicon 沒有出現在 Example URLs 中,不代表 Google 從未抓取。 因此,GSC 可以提供 Google 端的觀察證據,但無法完全取代 Server Log。

favicon,sitemap,favicon 沒顯示,sitemap couldn&#039;t fetch
favicon,sitemap,favicon 沒顯示,sitemap couldn&#039;t fetch

三個第一手驗證片段

這次排查中,有 3 個驗證片段讓整條證據鏈真正閉合,Good Vibe 好感數位整合把它們整理出來,因為每一個都對應一種常見的誤判:

第一,GSC 與 Server Log 排查結果完全吻合

GSC Crawl Stats 顯示 Googlebot-Image 以 200 成功抓取了 Root Favicon 檔案,回到 Server Log 檢查,同一時間點確實有一筆對應的請求,URL、回應碼、時間完全一致,來源 IP 通過 Reverse DNS 與 Forward DNS 雙向驗證。Google 端的紀錄與伺服器端的紀錄互相印證,「Google 已經成功抓到新版 Favicon」從推測變成事實。

第二,假 Googlebot 的反例

Log 裡另有掛著 Googlebot UA 的請求,拿去做 Reverse DNS,解析出來的 hostname 是一個與 Google 無關的網域,Forward DNS 更直接查無此主機。這筆請求如果沒有驗證,就會被當成 Google 的抓取紀錄,得出完全錯誤的結論。

第三,自己模擬的請求被自己排除

排查過程中用 curl 掛 Googlebot-Image UA 做的測試請求,全部留在 Log 裡。經過 IP 驗證,這些請求的來源明確不屬於 Google 網段,全數從證據中排除。這個片段說明了一件事:UA 模擬測試的用途是確認伺服器端不會擋爬蟲,它不能反過來當成 Google 有來抓的證據,2 件事必須分開。

完成哪些驗證後,可以排除抓取問題?

  1. Server Log 中存在通過雙向 DNS 驗證 or IP 清單比對的真 Googlebot 請求。
  2. 這些請求涵蓋了你關心的目標檔案 (Favicon、Sitemap),且回應為 200。
  3. GSC Crawl Stats 的紀錄與 Log 相符。

3 個條件成立,Crawler 存取層就是乾淨的,代表問題已經不在你能控制的範圍內,剩下的是 Google 內部處理與顯示層的時間差!

最後完成了哪些關鍵修正?Google 又是什麼時候更新的?

favicon sitemap troubleshooting 6

本段目標:整理這次排查中真正有價值的修正項目,說明結果收斂的過程,以及為什麼最後的成功不能歸因給任何單一動作。

這一系列的檢查花了不少時間,期間做過的調整遠比下面列出來的多。但事後回頭看,真正對結果有明確價值的,是以下 4 組修正,其他同時期的操作 (圖片壓縮參數、語系標記調整這類) 跟 Favicon 與 Sitemap 的問題沒有因果關係,不應該被寫進必要步驟裡。這個區分本身就是這篇紀實想傳達的重點之一:改了很多東西之後狀況好轉,不代表每個改動都是必要的。

Root Favicon 形成穩定版本

最終在網站根目錄建立了穩定的 /favicon.ico/favicon.png,2 個 URL 直接回傳正確的圖片內容,Content-Type 與實際檔案格式一致,沒有任何 Redirect。首頁 <head> 的 Declaration 指向的 URL 與實際檔案內容一致,多尺寸版本 (含 32×32 與 192×192) 全部保留、路徑固定。從這個版本定案之後,所有 Favicon 相關的 URL 就再也沒有更動過,這是整組修正裡最重要的一個原則:先讓訊號穩定,Google 才有一個穩定的目標可以抓。

修正 Legacy Favicon Redirect

網站歷史上換過 Favicon 的檔名與路徑,舊 URL 曾經處於「轉址回首頁」的狀態,也就是前面提過的那個最隱蔽的異常組合:狀態碼 200、Content-Type 卻是 text/html。修正方式是把每一條有抓取紀錄的舊 Favicon URL,逐一設定成 301 精準轉址到對應的有效新圖片,讓任何還記著舊路徑的抓取端,最終都能拿到一張真正的圖片,而不是一份 HTML。

這裡有一個實務上的取捨值得說明:Good Vibe 好感數位整合處理時只清理了有證據 (Log 裡有抓取紀錄、or 曾被頁面引用) 的舊 URL,沒有把歷史上出現過的所有圖片路徑全部翻出來轉址。沒有任何存取證據的歷史檔案,異動只會增加變因,不會增加價值。

Sitemap 架構收斂

Sitemap Index 底下的 Child 項目做了一次盤點:內容型態已經不再使用的 Child Sitemap,直接回應 410 明確告知永久移除,而不是留著一條空殼 or 轉址;持續使用的 Child 則確認每一條都回應 200 與正確的 XML 內容。收斂後的 Sitemap 結構變成一份「每一條都有效、沒有模糊地帶」的清單,搭配 robots.txt 的宣告對齊,網站端給 Google 的訊號從此只有一個版本。

Googlebot 抓取已獲證實

這是整條證據鏈的閉合點。上一個章節描述的驗證流程完成後,Server Log 中確認存在通過雙向 DNS 驗證的真 Googlebot-Image 請求,成功以 200 抓取了根目錄的新版 Favicon 檔案,GSC Crawl Stats 的紀錄與 Log 完全吻合。到這個時間點,前 3 層 (網站輸出、資源傳遞、Crawler 存取) 全部拿到了乾淨的證據,網站端能做的事情正式歸零。

Google 最後更新,但不能單一歸因

停止異動、進入純觀察期之後的某個階段,Server Log 出現了一波明顯的抓取高峰,短時間內的抓取量上升到平時的 10 倍以上 (如以下 GSC Crawl Stats 範例圖檔的高峰位置),涵蓋大量歷史 URL 與新內容。緊接著,幾個訊號在很接近的時間窗口內陸續收斂:SERP 上的品牌搜尋結果開始顯示新版 Favicon,GSC 的 Sitemap 報表狀態從 Couldn’t fetch 轉為 Success,期間發布的文章也確認進入索引。

favicon,sitemap,favicon 沒顯示,sitemap couldn&#039;t fetch

看到這裡你可能會想問:所以到底是哪個修正起了作用?

Good Guy 編的誠實回答是:無法、也不應該把結果歸因給任何單一動作。能確認的事實有兩層:

  1. 第一層:網站端早期確實存在真實的技術問題 (不乾淨的尺寸宣告、轉址回首頁的舊 URL),這些問題被逐一修正,且修正後的狀態有完整證據支持。
  2. 第二層:從修正完成到 Google 端全面更新之間存在明顯的時間差,這段延遲發生在外部無法觀測的處理層,抓取高峰與訊號收斂的先後順序是觀察到的事實,但它們之間的因果機制是 Google 內部的事,任何宣稱「做了 X 所以 Y 天後就好了」的說法,都超出了證據能支持的範圍。

修正後怎麼觀察

停止異動不等於什麼都不做,有以下 4 個方法:

  1. 以週為單位檢查,不要每天刷。觀察的對象是趨勢,Google 官方文件對 Favicon 更新的說法是數天到數週,天天看只會增加焦慮,不會加速任何事。

  2. 固定觀察 3 個訊號:SERP 實際顯示、GSC Sitemap 報表狀態、GSC Crawl Stats 是否持續有正常抓取。

  3. 觀察期間不重複操作。不反覆 Request Indexing、不重新提交 Sitemap、不再調整任何 Favicon 相關設定,任何新動作都會讓你無法判斷後續變化是誰造成的。

  4. 如果經過多個星期完全沒有變化,Google 有一個官方的 Favicon 問題回報表單可以提交。但提交後要抱持正確的期待:那是回報管道,不是客服工單,官方不保證個案會被處理,它是升級選項,不是加速按鈕。

這次調整後,哪些技術 SEO 問題最容易誤判?

本段目標:把這次排查中出現過的誤判整理成對照表,這些判斷在當下看起來都很合理,事後驗證才知道方向錯了,先看過可以幫你少走一段冤枉路。

早期容易出現的判斷修正後認知
瀏覽器顯示正常,代表網站端沒問題瀏覽器有自己的快取與容錯機制,它的顯示結果不能代表 Crawler 拿到的內容,要用 HTTP Response 直接驗證
SERP 顯示灰色地球,代表 Favicon 檔案壞了顯示層異常的原因可能在 5 層中的任何一層,檔案本身正常、卡在快取 or 處理層的情況真實存在
GSC 顯示 Couldn’t fetch,代表 Sitemap 真的抓不到報表狀態有延遲與快取的可能,要用網站端證據與 Server Log 交叉驗證,不能只看報表下結論
Log 裡有 Googlebot UA,代表 Google 來過User-Agent 可以偽造,只有通過雙向 DNS 驗證 or 官方 IP 清單比對的請求才算數
用 curl 模擬 Googlebot 測試成功,代表 Google 抓得到UA 模擬只能證明伺服器不擋爬蟲,不能證明 Google 實際來抓過,2 件事要分開
反覆 Request Indexing 可以加速更新提交進入佇列之後,重複提交不會更快,只會讓你分不清楚後續變化的原因
有裝 CDN 比較專業、網站一定比較快是否需要 CDN 取決於市場範圍、流量規模與節點位置,條件不符時效能可能不升反降
Hotlink Protection 開了比較安全,不會有副作用規則設定成封鎖空 Referer 時,有機會連帶擋到搜尋引擎爬蟲,開啟前要確認排除清單
第三方工具說 32×32 太小要刪除常見網站系統本來就會同時輸出多種尺寸,這是正常供應,真正的重點是 URL 穩定
Google s2 快取端點還是舊圖,代表網站有問題那是顯示層的快取服務,不是官方文件化的檢測工具,只能當觀察線索,不能當診斷依據
修正完成後,Favicon 幾天內一定會更新官方說法是數天到數週,且明確聲明不保證顯示,把它當成可控時程本身就是誤判
改了很多設定之後狀況好轉,代表每個改動都有用同時期的操作只有時間相關性,把全部動作寫成必要步驟,會誤導下一個遇到問題的人

這張表的最後一列,Good Guy 編認為是整篇文章最重要的一列。技術排查最大的陷阱不是找不到問題,是在狀況好轉之後,把過程中做過的每件事都當成答案。分得清楚哪些修正有證據支持、哪些只是剛好同時發生,才是這類檢查真正的專業所在。

遇到相同問題,品牌端應按照什麼順序排查?

favicon sitemap troubleshooting 7

本段目標:把前面所有排查濃縮成一套可以直接套用的操作順序,之後遇到類似狀況,不用重新想一次邏輯,照著走就好。

Step 1:保存當下狀態

先截圖、存檔,不動任何設定。SERP 顯示畫面、GSC Sitemap 報表、首頁原始碼、Favicon 與 Sitemap 的 HTTP Header,全部留一份唯讀紀錄。沒有這一步,後面所有判斷都缺乏比對基準。

Step 2:判斷是否需要 CDN,並檢查快取/防盜鏈

先確認服務範圍、流量規模與節點位置這 3 個條件,判斷 CDN 是不是真的必要。如果已經在用,優先檢查 Hotlink Protection 的規則是否會封鎖空 Referer 的請求,並確認排除清單有沒有涵蓋主流搜尋引擎爬蟲。

Step 3:檢查 Favicon 網站輸出

用萬用回應檢查指令,逐一確認首頁狀態、Root Favicon 的狀態碼與 Content-Type、實際檔案類型與尺寸、舊 URL 的 Redirect 導向,以及 robots.txt 是否擋住圖片目錄。同步比對一般請求與模擬 Googlebot-Image 請求,確認拿到的內容一致。

Step 4:檢查 Main/Child Sitemap

確認 Main Sitemap 的狀態碼、Content-Type 與 XML 格式,列出所有 Child Sitemap 逐條檢查回應是否正常,並確認 robots.txt 的 Sitemap 宣告與提交給 GSC 的 URL 一致。

Step 5:確認真 Googlebot

不要只看 User-Agent。用 Reverse DNS + Forward DNS 雙向驗證,or 比對 Google 官方 IP Ranges 清單,確認 Server Log 裡的抓取紀錄真的來自 Google,並跟 GSC Crawl Stats 交叉比對。

Step 6:判斷問題層級

對照五層排查順序,把已經拿到的證據分類:網站輸出、資源傳遞、Crawler 存取這 3 層有沒有問題,都可以直接證明。如果這 3 層全部乾淨,問題就已經不在你能控制的範圍內,屬於 Google 內部處理與顯示層的時間差。

Step 7:每次只改一組有證據支持的問題

不要一次改多個設定。每次異動只針對一個有明確證據支持的問題,改完之後重新驗證,確認這個問題真的解決了,再決定要不要處理下一個。前 3 層全部乾淨之後就停手,剩下的交給觀察期,不要反覆操作。

Favicon、Sitemap 與 CDN 常見問題 FAQ

本段目標:整理排查過程中會被反覆問到、但正文沒有直接用一句話回答完的問題。

Q1:Favicon 顯示與否會影響 Google 排名嗎?

不會。Favicon 不是 Google 官方確認的排名因素,但它會影響 SERP 上的品牌辨識與點擊意願,這屬於間接的商業影響,不是排名因子。

Q2:沒有使用 CDN 會影響 SEO 嗎?

CDN 本身不是 Google 官方排名因子,但它可能透過影響網站速度,間接影響 Core Web Vitals 這類頁面體驗訊號。是否需要 CDN,取決於服務範圍、流量規模與節點位置,不是裝了就一定加分。

不一定,但有機會。如果規則設定成封鎖空 Referer 的請求,就有機會連帶擋到 Googlebot-Image。多數 CDN 都有排除設定可以另外允許,開啟防盜鏈保護前先檢查一次比較保險。

Q4:網站系統本身 (e.g. WordPress) 不是已經產生 Favicon 了嗎,為什麼還要在根目錄另外放一份?

系統原生機制通常只處理首頁 <head> 裡的 <link> 宣告。根目錄額外放一份穩定的 /favicon.ico,是為了因應部分瀏覽器、工具與連結預覽機制在讀不到 <link> 標籤時,會自動嘗試打根目錄這個路徑的行為,這是廣泛採用的技術慣例,不是重複工作。

Q5:Sitemap 顯示 Couldn’t fetch,會不會影響現有頁面的排名?

Couldn’t fetch 這個報表狀態本身,不會直接讓已經索引的頁面掉排名。Google 也不會因為之後一次讀取失敗,就忘記先前已成功讀取的 Sitemap 資訊。

如果 Sitemap 無法抓取是因為網站停機、robots.txt 封鎖 or 伺服器持續異常,同一個底層問題可能同時影響其他頁面的抓取。 如果網站目前運作正常,而 Live Test 與 Server Log 已證明 Google 可以成功取得 Sitemap,就不能只因為報表仍顯示 Couldn’t fetch,直接推論排名正在受損。

Q6:Favicon 或 Sitemap 修正後,多久會反映在 Google 端?

官方說法是數天到數週,且明確聲明不保證顯示結果。建議以週為單位觀察,不要天天檢查,也不要在等待期間反覆重新操作。

Q7:Google 的 favicon 快取端點 (s2 服務)一直沒更新,代表網站還有問題嗎?

不一定。這是一個顯示層的快取服務,不是官方文件化的診斷工具,它的更新時間點跟 SERP 本身的顯示時間點不必然同步,只能當觀察線索,不能單獨拿來判斷網站端是否還有問題。

總結:技術 SEO 不只要會修,也要知道何時停止修改

Favicon 恢復正常顯示之後,品牌搜尋結果不再是一顆灰色地球,使用者掃過 SERP 或 AI Overview 引用清單時,看到的是清楚的品牌識別,這對進站意願與專業度感受是實際的正面影響。

Sitemap 狀態收斂為 Success,代表 Google 已成功取得並讀取這份 Sitemap,解析出的 URL 會進入後續抓取安排。這讓網站重新擁有一條乾淨的 URL 發現提示,但不代表所有頁面都會立即被抓取、索引 or 取得排名。

回顧整個過程,Good Guy 編認為最值得記住的不是任何一個具體的修正動作,而是排查的順序:先保存現場,再依照五層排查順序逐層驗證,每一層都用可以證明的證據下判斷,而不是憑感覺猜測 or 反覆嘗試。

網站輸出、資源傳遞、Crawler 存取這 3 層,你可以直接控制、直接證明;Google 內部處理與顯示層,你只能等待與觀察。分清楚這個界線,才知道什麼時候該繼續修,什麼時候該停手。

Good Vibe 好感數位整合在處理品牌官網的技術 SEO 問題時,重複用到的正是這套邏輯:訊號衝突時不猜測,用證據鏈把問題定位到正確的層級,再判斷該修改設定,還是該耐心等待 Google 的處理週期。如果你的品牌也遇到類似的訊號矛盾,不確定問題卡在哪一層,歡迎透過 Good Vibe 好感數位整合的官網表單跟我們聊聊,讓我們一起把排查順序理清楚。

作者簡介

相關文章