Skip to content
所有文章 ‹ Part 02 of 18 · Cache 不是方塊,是一條鏈
工程 · 2 min read

一個 HTTP request

Request 就是一次跨網路的函式呼叫。整理 method、header、ETag 和 status code,包括後來讓整層 cache 失效的 HEAD 和 405。

Request 像一次跨網路的函式呼叫。Request 帶參數,response 是回傳值。

我是後端工程師,每天都在寫 API。但我很少看 header 和 status code 的細節。這次追查讓我把它們重新看了一遍。

browserserver GET /assets/abc123/index.htmlHost: cdn.example.comrequest = method + path + headers 200 OKcontent-type: text/htmlcache-control: public, max-age=3600etag: "32b7140e..."(約 2 MB 的 HTML)response = status + headers + body
Request 帶著 method、path 和 header,response 回傳 status、header 和 body。
  • Header:一行 name: value。中間的每一層(CDN、load balancer)都會讀 header,有些層還會加自己的 header(Cache header:誰設定,誰讀取)。
  • ETag:檔案內容的版本標籤。檔案內容改變,ETag 就跟著改變。

Method

  • GET:「把檔案給我」。Response 有 header 和 body。
  • HEAD:「只給我 header」。Header 和 GET 一樣,body 是空的。Cache 可以用 HEAD 檢查檔案的 ETag、大小和日期,不用下載整個檔案。

Status code

2xx成功200 OK檔案在這裡 3xx沒有變化304 Not Modified你的副本還是最新的,沒有 body 4xxrequest 錯誤404 Not Found這個路徑沒有東西405 Method Not Allowed路徑存在,但不接受這個 method 5xxserver 壞了500, 502, 503
第一個數字就是分類,405 表示路徑存在,但不接受這個 method。

我一開始覺得 HEAD 和 405 是冷門知識。後來整個問題的關鍵,就是一個 HEAD 拿到 405(Proxy 不接受 HEAD,刷新永遠失敗)。

冷門的 method 和 status code,常常就是 bug 藏身的地方。

延伸閱讀:CDN 是什麼、Cache 的新鮮度:fresh、stale 和 304、Cache header:誰設定,誰讀取、Proxy 不接受 HEAD,刷新永遠失敗。或回到系列總覽。

↑↓ 移動 ↵ 開啟 esc 關閉