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 teapot | 1998 年愚人節的玩笑,然後就再也沒消失過。 |
| Unprocessable Content | 格式沒問題,但語意上是錯的——例如合法的 JSON 裡有不合法的欄位。 |
| Too Many Requests | 你被限流了,`Retry-After` 會告訴你什麼時候可以再來。 |
沒有符合的狀態碼。
它實際上說了什麼
404 只說了一件事:這個位址上沒有東西。
它刻意不說這裡曾不曾有過、之後會不會有,也不說如果有的話你有沒有資格看。這種含糊是特意 設計的——正是它讓伺服器可以隱藏某樣東西的存在,而不必承認自己在隱藏。
該用 404 還是 410
如果你確定那個東西曾經存在、而且是被刻意移除的,410 Gone 是更好的答案。它是一個更強 的陳述:不是「我找不到」,而是「這東西是刻意消失的」。
實際差別在爬蟲。搜尋引擎會把 404 當成可能只是暫時的,還會再回來看一陣子;410 則告訴它們 可以停了,頁面也會更快從索引中移除。如果你是有意識地要淘汰一批網址,410 才是你真正的意思。
其他時候用 404 就好——而那是大多數情況,因為大部分伺服器根本分不出「從來沒有過」和「去年 被刪掉了」。
遇到不該出現的 404 時
大致按照「後來發現真的是這個原因」的頻率排列:
- 結尾的斜線。
/about和/about/是兩個不同的網址,很多伺服器只處理其中一個。 - **大小寫。**路徑在 Linux 伺服器上區分大小寫,在 macOS 和 Windows 上不區分,所以本機 正常的連結到了正式環境就 404。
- **路由存在,但方法不對。**有些框架在對「只接受 GET 的路由」發 POST 時會回 404,而不是 正確的 405 Method Not Allowed,這會把你引導到完全錯誤的方向去找問題。
- 改寫或轉址規則比你預期的更早就被命中了。
- 單頁應用程式沒有伺服器端的 fallback:在應用程式裡點過去正常,直接開網址就 404。
404 頁面本身也該是 404
自訂錯誤頁是好事,但用 200 狀態送出它就不是了——那叫做「軟 404」,等於告訴每一個爬蟲 說:這頁滿是「找不到」的內容是值得收錄的真實內容。狀態碼要跟著頁面一起設對。
也讓那一頁真的有用:一個搜尋框,加上一個回到該網址所屬區塊的連結,勝過一句道歉。