Blog · 2026-08-30
你的站可能正在白燒爬取預算:soft 404 與 Cloudflare Pages 的 SPA fallback 陷阱
壞網址一律回 200 加一整份首頁,不是「反正有東西」,而是爬蟲把抓取額度花在垃圾網址上——一個 404.html 就能修,修完還會看到一批原本看不見的問題。
新站收錄一直上不去,你以為是內容不夠好。其實還有一種可能:所有不存在的網址——失效的舊外連、打錯字的內鏈、掃描器亂試的路徑——你的站全部回 200,還奉上一整份首頁。爬蟲每天來,額度全花在這些垃圾請求上,真正該抓的頁面反而排不進去。
病徵:curl 一個不存在的路徑,看它回什麼
我們手上一個 60 多頁的內容站,長期苦於爬取量不足。健檢時 curl 了幾個確定不存在的路徑:/random-xyz、/rss.xml、/llms.txt,全部回 HTTP 200,body 是完整的首頁 HTML,87KB,canonical 指向 /。
這就是 soft 404:網址不存在,伺服器卻說「有」。它有兩個陰險的特性:
- 監控全綠。uptime 檢查、點擊測試都拿到 200,永遠不會告警。
- 連你自己都會被騙。想確認站上有沒有
llms.txt,curl 回 200 就當它存在——其實拿到的是首頁。我們真的被這樣騙過一次。
成因很單純:Cloudflare Pages 的建置產出根目錄裡沒有 404.html 時,會自動退回 single-page application 模式,未命中的路徑一律回 index.html 加 200。對真正的 SPA 這是功能;對多頁靜態站這是災難,而且是無聲的預設行為。
為什麼這在燒爬取預算
「首頁 canonical 指向 /,壞網址不會被收錄成重複內容,不就沒事?」
收錄確實擋住了,爬取沒有。canonical 寫在 HTML 裡,Googlebot 得先下載整份 87KB 首頁才讀得到它——每個壞網址都是一次完整下載。而壞網址的來源比想像中多:別人打錯的外部連結、改版留下的舊路徑、掃描器固定會踩的 /feed、/.env 之類。
更糟的是,回 200 等於告訴搜尋引擎「這個網址活著」,它會留在排程裡被反覆重抓;真正的 404 則會被逐步降低重抓頻率。Google 的爬取預算管理指南也把 soft 404 明列在浪費爬取資源的因素裡。對大站這是雜訊;對一個爬取量本來就不足的站,這是把救命的額度倒進水溝。
修法:放一個 404.html,讓平台退出 SPA 模式
修法便宜到不成比例:在建置產出根目錄放一個真的 404.html,Cloudflare Pages 偵測到它就切回靜態站模式,未命中路徑改回真正的 HTTP 404。
我們把 404 頁做進產生器而不是手寫孤兒檔:用站上同一套 CSS 與導覽,放上主要頁面的連結,讓誤入的真人有路可走。
實測結果:
- 壞網址:200 / 87KB → 404 / 34KB
- 站上 67 個真實頁面全數維持 200,零誤傷
- 換 Googlebot 的 UA 重打一輪,一樣拿到 404
驗證要驗三面:壞網址變 404、好網址沒跟著壞、爬蟲身分看到的跟你一樣。只驗第一項就收工,是在賭。
修好隔天,死連結現形
soft 404 修好的隔天,自己人點導覽列就撞上 404。追查發現首頁導覽列有兩條存在已久的死連結:一條指向從頭到尾沒做出來的頁面;另一條多包了一層目錄——正確路徑是 /how-to-pick/,連結卻寫成 /guide/how-to-pick/。
為什麼從來沒人發現?因為在 soft 404 時代,點下去回 200 和首頁,看起來像「怪怪的但能用」。404 修好,這些連結第一次真的以 404 的樣子出現在人眼前。根因也很典型:首頁手工維護、內頁導覽由產生器生成,兩邊各自演化就走鐘了。
所以別把修好 404 當結案——它是讓舊問題現形的開始。接下來幾天,預期會撈到一批原本隱形的壞連結。
把檢查做成部署閘門,並先證明它會叫
人眼抓不到的問題,就不該繼續靠人眼。我們在部署流程加了一道死連結閘門:掃描建置產出裡每一條站內 href,只要指不到實際檔案、又沒有轉址規則接住,就直接擋下這次部署。
關鍵在負面測試:故意把已知的死連結插回去,確認閘門真的會擋。沒看過它擋下東西的閘門,只是讓人安心的裝飾。
同一輪全站掃描還撈出另一個肉眼看不見的問題:27 頁的標題超過 30 個全形字(含首頁的 33.5 字),而繁中搜尋結果頁大約 28–30 字就截斷,多出來的部分等於白寫。逐頁壓進 30 字內——保留品牌與核心關鍵句、只砍後段贅語——改完超標歸零。
結語
soft 404 難纏不在修——一個 404.html 就解決——而在它全程無症狀:監控綠燈、點擊有頁面、連檢查指令都會被騙。如果你的站掛在 Cloudflare Pages 或任何帶 SPA fallback 的平台,現在就 curl 一個不存在的路徑看它回什麼;回 200,你就找到收錄不動的其中一個原因了。修完記得把死連結掃描做成部署閘門,再用負面測試證明它會動。這類「看起來沒壞所以沒人修」的問題,我們處理過不少;想確認自己站上還藏著哪些,歡迎來找我們聊聊。