HTTP 狀態碼與標頭 132 項
404 和 500 到底是什麼意思,Content-Type 和 Cache-Control 各管什麼,一行說清。
狀態碼
1xx 資訊4
只是告訴你還在進行中,真正的答覆隨後就到。
2xx 成功10
請求已經妥善處理完了。
200 OK請求成功,正文就在下面。201 Created新資源已建立。Location 裡寫著它的位址。202 Accepted請求已收下,但還沒做完。做完了得另外去查。203 Non-Authoritative Information回來的內容被中間的代理改過,不是來源伺服器的原樣。204 No Content處理成功,但沒有正文。刪除之後常見這個。205 Reset Content處理成功,請把輸入的表單清空重來。206 Partial Content只回了請求的那一段。續傳和影片拖曳靠它。207 Multi-Status一次請求裡含多個操作,各自的結果分別寫在正文裡。208 Already Reported同一個東西前面已經報過了,這裡不再重複。226 IM Used回來的是差異部分,不是整份內容。
3xx 重新導向7
讓你去別的地方 —— 區別在於是永久還是暫時。
4xx 請求有誤29
問題出在請求這一側。原樣再發一次,還是會失敗。
400 Bad Request請求本身寫得不對,伺服器讀不懂。401 Unauthorized需要先登入。沒帶身分或者帶錯了。402 Payment Required為付費場景預留的編號,實際上幾乎不用。403 Forbidden東西在,但你沒有權限看。404 Not Found這個位址上什麼都沒有。405 Method Not Allowed位址是對的,但不接受你用的這個方法。406 Not Acceptable伺服器給不出你在 Accept 裡要求的那種格式。407 Proxy Authentication Required要先通過中間代理的身分驗證。408 Request Timeout等你的請求等太久,伺服器先斷了。409 Conflict和目前狀態衝突了,比如兩個人同時改同一份東西。410 Gone以前有,現在被永久刪掉了,也不會再回來。411 Length Required得先寫明 Content-Length 才收。412 Precondition Failed你加的前提條件不成立,所以沒有執行。413 Content Too Large送來的正文太大了。414 URI Too Long網址太長了,超出伺服器能處理的長度。415 Unsupported Media Type這種格式的正文伺服器不收。416 Range Not Satisfiable你要的那一段超出了檔案的範圍。417 Expectation FailedExpect 裡提的要求,伺服器滿足不了。418 I'm a teapot愚人節玩笑留下的編號 —— 我是茶壺,煮不了咖啡。421 Misdirected Request這條連線送錯了地方,這台伺服器管不了這個網域。422 Unprocessable Content格式沒問題,但內容說不通,處理不了。423 Locked物件被鎖住了,暫時動不了。424 Failed Dependency前一個請求失敗,連帶這個也做不成。425 Too Early太早了。重放風險還沒排除,先不處理。426 Upgrade Required得升級到別的協定才能繼續。428 Precondition Required必須帶上前提條件才受理,以免覆蓋掉別人的修改。429 Too Many Requests短時間裡請求太多了,慢一點再來。431 Request Header Fields Too Large請求標頭太大,超出了伺服器的上限。451 Unavailable For Legal Reasons出於法律原因不能提供。
5xx 伺服器有誤11
問題出在伺服器那一側。過一會兒再試往往值得。
500 Internal Server Error伺服器內部出錯了,具體原因沒往外說。501 Not Implemented這個功能伺服器根本沒實作。502 Bad Gateway前面的伺服器從後面那台拿到了壞回應。503 Service Unavailable暫時接不了客 —— 過載或者在維護。504 Gateway Timeout等後面那台伺服器等逾時了。505 HTTP Version Not Supported你用的 HTTP 版本,伺服器不支援。506 Variant Also Negotiates內容協商的設定繞成了環,伺服器出不來。507 Insufficient Storage儲存空間不夠,存不下了。508 Loop Detected處理過程中發現無限迴圈,只好中斷。510 Not Extended還需要額外的擴充資訊才能處理。511 Network Authentication Required得先在這個網路上完成登入 —— 公共 Wi-Fi 常見。
標頭
請求標頭28
瀏覽器往伺服器發的時候帶上的標頭。
Accept告訴伺服器自己想要哪種格式的內容。Accept-Encoding告訴伺服器自己能解開哪些壓縮方式。Accept-Language告訴伺服器自己偏好哪種語言。Authorization帶上身分憑證,用來通過驗證。Cookie把先前存下的 cookie 一起送回伺服器。Host寫明要存取的網域。一台伺服器上放多個網站時靠它區分。If-Modified-Since這個時間之後有改動才給我,沒改就回 304。If-None-MatchETag 和我手上的不一樣才給我,一樣就回 304。Origin告訴伺服器這個請求是從哪個來源發出來的。Range只要檔案的某一段,不要整份。Referer寫明是從哪個頁面點過來的。拼寫少了一個 r 是當年的筆誤。User-Agent自報瀏覽器和作業系統。Sec-Fetch-Dest說明這次請求是要拿去當圖片、腳本還是頁面用。Sec-Fetch-Mode說明這次請求的模式 —— 同源、跨源還是導覽。Sec-Fetch-Site說明請求方和目標方是不是同一個網站。DNT表示不希望被追蹤。要不要理會由網站自己決定。Expect先問伺服器收不收,再決定要不要把正文送過去。Forwarded把經過的代理資訊按標準格式記下來。From留下發起請求者的電子郵件位址。爬蟲偶爾會帶。If-MatchETag 和我手上的一樣才動手,用來防止覆蓋別人的修改。If-Range檔案沒變就繼續給我那一段,變了就整份重來。Max-Forwards限制這個請求最多還能經過幾層代理。Proxy-Authorization帶上給中間代理看的身分憑證。TE告訴伺服器自己能接受哪些傳輸編碼。Upgrade-Insecure-Requests表示願意把 http 的請求自動換成 https。X-Forwarded-For記下最初那個用戶端的 IP,讓後面的伺服器看得到。X-Forwarded-Proto記下用戶端原本用的是 http 還是 https。X-Requested-With標明這是腳本發出的非同步請求。舊程式裡常見。
回應標頭30
伺服器答覆瀏覽器的時候帶上的標頭。
Access-Control-Allow-Origin指明哪些來源可以讀這個回應。CORS 的核心一行。Access-Control-Allow-Methods跨源時允許使用哪些方法。Access-Control-Allow-Headers跨源時允許帶上哪些請求標頭。Access-Control-Allow-Credentials允許跨源時一併帶上 cookie 和驗證資訊。Access-Control-Max-Age預檢結果可以快取多久,省下重複的預檢請求。Age這份回應在快取裡待了多少秒。Allow列出這個位址允許的方法。405 常和它一起出現。Content-Disposition決定是直接顯示還是當成檔案下載,也能指定檔名。Content-Security-Policy規定這個頁面能載入哪些來源的腳本和資源。ETag內容的指紋。內容一變,這串就變。Expires寫明這份內容到哪個時刻為止算新鮮。Last-Modified內容最後一次改動的時間。Location重新導向要去的位址,也用來寫新建資源的位址。Permissions-Policy規定頁面能不能用相機、麥克風、定位這些功能。Referrer-Policy規定往外發請求時,Referer 裡透露多少。Retry-After告訴你隔多久再來。429 和 503 常帶著它。Server自報伺服器軟體。出於安全考量,很多網站把它藏起來。Set-Cookie讓瀏覽器把 cookie 存下來。Strict-Transport-Security要求瀏覽器此後一律用 https 存取本站。Timing-Allow-Origin允許跨源的腳本讀取本次請求的耗時資料。Vary說明這份回應會隨哪些請求標頭而變,快取要照著分開存。WWW-Authenticate告訴用戶端該用哪種方式來驗證。和 401 一起出現。X-Content-Type-Options禁止瀏覽器擅自猜測內容類型。X-Frame-Options規定本頁能不能被別的頁面嵌進框架裡。X-XSS-Protection舊瀏覽器的跨站腳本過濾開關。如今已由 CSP 取代。Cross-Origin-Opener-Policy把本頁和別的來源開的視窗隔開。Cross-Origin-Resource-Policy規定這份資源允許被哪些來源載入。Cross-Origin-Embedder-Policy要求頁面裡嵌的東西必須明確表態可被嵌入。Content-Range說明這一段在整份內容裡的位置。Accept-Ranges表明伺服器支援按段取。續傳靠它。
兩邊通用13
請求和回應兩邊都可能出現的標頭。
Cache-Control規定這份內容能不能快取、能存多久。Connection這次之後連線是留著還是斷開。Content-Encoding說明正文用了哪種壓縮方式。Content-Language說明正文是哪種語言寫的。Content-Length正文有多少位元組。Content-Type說明正文是什麼格式,以及用什麼字元集。Date這條訊息產生的時刻。PragmaHTTP/1.0 時代的快取開關。如今由 Cache-Control 接手。Trailer預告正文之後還會補上哪些標頭。Transfer-Encoding說明正文是怎麼切塊送過來的。Upgrade提議把這條連線換成別的協定。Via記下這條訊息經過了哪些代理。Warning對回應的額外提醒,多和快取有關。現已廢棄。
怎麼看這一頁
- 狀態碼的第一位定了大方向:4 開頭是請求那側的問題,5 開頭是伺服器那側的問題。
- 404 是「沒有」,403 是「有,但不給你」。兩個混著用,排查起來只會更慢。
- 標頭名不分大小寫。Content-Type 和 content-type 是同一個標頭。
- 快取和 CORS 的毛病,多半就差一行標頭。在瀏覽器開發者工具的網路面板裡能直接看到。
常見問題
Q. 404 和 403 有什麼區別?
404 說的是那個位址上什麼都沒有;403 說的是東西在,但你沒資格看。不過也有伺服器故意回 404,好把「這裡存在一個資源」這件事本身藏起來。
Q. 碰到 500 我能做點什麼?
5 開頭的都是伺服器那側的問題,多半只能等。不過 502 和 504 是前後兩台伺服器之間的事,隔一會兒重試常常就好了。
Q. 301 和 302 怎麼選?
位址永久搬走用 301,只是暫時繞道用 302。要留意瀏覽器和搜尋引擎會把 301 記很久,改回來很麻煩。
Q. 標頭名分大小寫嗎?
不分。Content-Type 和 content-type 是同一個標頭;從 HTTP/2 起,乾脆規定一律用小寫傳送。
Q. CORS 錯誤是怎麼來的?
頁面想讀另一個來源的回應,而伺服器沒用 Access-Control-Allow-Origin 放行,瀏覽器就會攔下來。伺服器其實已經把回應發回來了,只是瀏覽器不肯把正文交給你的程式 —— 所以網路面板裡看得見,腳本裡卻讀不到。