toolfree

404 Not Found

404 實際上代表什麼、為什麼它和 410 不一樣,以及遇到意料之外的 404 時該檢查哪些地方。

在你的瀏覽器中執行

點一下代碼即可複製。

4xx · 用戶端錯誤

請求本身有問題,或是不被允許。改變請求內容可能會有幫助。

代碼意義
Bad Request伺服器根本看不懂這個請求。
Unauthorized你尚未通過身分驗證,伺服器不知道你是誰。名字取錯了:401 的意思是「未驗證身分」,「沒有權限」是 403。401 必須帶上 `WWW-Authenticate` 標頭。
Forbidden伺服器知道你是誰,但你就是不能拿到這個東西。重新登入沒有用。如果連「這個資源存在」本身都算機密,回 404 才是比較安全的做法。
Not Found這個位址上沒有任何東西。它完全沒有說這東西曾經存不存在。如果你確定它永遠消失了,請用 410。
Method Not Allowed這個位址存在,但不接受這個方法。回應必須列出可用的方法。
Conflict請求與目前的狀態衝突,例如你正在修改的其實是舊版本。
Gone它曾經存在,而且是刻意被移除的,不會再回來。
I'm a teapot1998 年愚人節的玩笑,然後就再也沒消失過。
Unprocessable Content格式沒問題,但語意上是錯的——例如合法的 JSON 裡有不合法的欄位。
Too Many Requests你被限流了,`Retry-After` 會告訴你什麼時候可以再來。

它實際上說了什麼

404 只說了一件事:這個位址上沒有東西。

它刻意不說這裡曾不曾有過、之後會不會有,也不說如果有的話你有沒有資格看。這種含糊是特意 設計的——正是它讓伺服器可以隱藏某樣東西的存在,而不必承認自己在隱藏。

該用 404 還是 410

如果你確定那個東西曾經存在、而且是被刻意移除的,410 Gone 是更好的答案。它是一個更強 的陳述:不是「我找不到」,而是「這東西是刻意消失的」。

實際差別在爬蟲。搜尋引擎會把 404 當成可能只是暫時的,還會再回來看一陣子;410 則告訴它們 可以停了,頁面也會更快從索引中移除。如果你是有意識地要淘汰一批網址,410 才是你真正的意思。

其他時候用 404 就好——而那是大多數情況,因為大部分伺服器根本分不出「從來沒有過」和「去年 被刪掉了」。

遇到不該出現的 404 時

大致按照「後來發現真的是這個原因」的頻率排列:

404 頁面本身也該是 404

自訂錯誤頁是好事,但用 200 狀態送出它就不是了——那叫做「軟 404」,等於告訴每一個爬蟲 說:這頁滿是「找不到」的內容是值得收錄的真實內容。狀態碼要跟著頁面一起設對。

也讓那一頁真的有用:一個搜尋框,加上一個回到該網址所屬區塊的連結,勝過一句道歉。