最後更新: 2022-10-27
Header
- Cache-Control
- Expires 與 Pragma
- Vary header
- ETag
Cache-Control
- "no-cache" CDN 可以 Cache. 表示必須先與伺服器確認傳回的回應是否已變更(透過 ETag 檢查)
- "no-store" 禁止 Browser / CDN cache 它 (隱私資料)
- "max-age" 從目前請求起 cache N 秒.
- "private" 內容只開放給單一使用者, 因此 CDN 不應 cache 它. 但 Browser 是可以 cache 的
- "public" 可有可無的設定
* 只能建議 CDN 如何去 cache, CDN 如何做就強制不了.
e.g.
Apache
<FilesMatch ".(ico|js|css)$"> Header set Cache-Control "no-store, no-cache" </FilesMatch>
Header
Cache-Control: no-store, no-cache
Expires 與 Pragma
e.g.
Expires: Thu, 19 Nov 1981 08:52:00 GMT Pragma: no-cache
Expires
Syntax
Expires: <http-date>
http-date: "Wed, 21 Oct 2023 08:00:00 GMT"
* "0" represent a date in the past and mean that the resource is already expired.
* If there is a Cache-Control header with the max-age or s-maxage directive in the response,
the Expires header is ignored.
Pragma
Pragma: no-cache => "Cache-Control: no-store, no-cache"
Pragma = 舊方式 (新: cache-control: no-cache)
* "cache-control" headers take precedence on most modern systems
Vary response header
Server --> Client
In contrast to the previous Accept-* headers, which are sent by the client,
The Vary HTTP header is sent by the web server in its response.
----
Use this header if you dynamically serve different content for the same URL.
It indicates the list of headers(i.e. User-Agent) the server uses during the server-driven content negotiation phase.
The Vary header is needed to inform the cache of the decision criteria so that it can reproduce it.
----
目的: 防止 cache 錯野 (mobile 版, desktop 版)
----
Vary: User-Agent
It is a http header stating that different content is served to different User-Agent(Brownser)
----
Vary: *
The special value '*' means that the server-driven content negotiation also
uses information not conveyed in a header to choose the appropriate content.
Obviously, the wildcard '*' prevents caching from occurring, as the cache can't know what element is behind it.
----
If server can't provide a suitable resource,
it might respond with 406 (Not Acceptable) or 415 (Unsupported Media Type)
ETag
ETag 的功用是如果資源的內容沒有發生改變, Web服務器就不需要發送一個完整的響應
要點
- ETag 的比較只對同一個URL有意義
- ETag在HTTP頭字段中的使用是可選的
- 沒有明確指定生成ETag值的方法 (版本號, CRC, MD5)
- 客戶端可以決定是否緩存這個資源和它的ETag。
強/弱 ETag
- "123456789" # 強ETag驗證符
- W/"123456789" # 弱ETag驗證符
強 ETag 要求兩個資源內容的每個字節需完全相同
運作
如果客戶端再次訪問相同的URL, 將會發送一個包含已保存的ETag 的 "If-None-Match" header
客戶端請求之後, 服務器可能會比較客戶端的ETag和當前版本資源的ETag,
如果 ETag 值匹配, 那服務器便會發送回一個極短的響應(304)
myurl=https://datahunter.org/themes/mytheme/logo.png
curl -I $myurl
HTTP/1.1 200 OK ... ETag: "639f-15fc-4a0f77094aa40"
curl -I -H 'If-None-Match: "639f-15fc-4a0f77094aa40"' $myurl
HTTP/1.1 304 Not Modified