页面应该怎么设置缓存头?Last-Modified 怎么比较?Flask 什么时候会自动加 Vary?带登录态的响应会不会被 CDN 缓存?这篇逐项实测。
首次: 200 | Last-Modified = Thu, 01 Oct 2026 12:00:00 GMT If-Modified-Since 等于 Last-Modified (Thu, 01 Oct 2026 12:00:00 GMT) → 304 If-Modified-Since 晚 1 秒 (Thu, 01 Oct 2026 12:00:01 GMT) → 304 If-Modified-Since 早 1 秒 (Thu, 01 Oct 2026 11:59:59 GMT) → 200 If-Modified-Since 格式非法 (yesterday) → 200 /both 同时有 ETag 与 Last-Modified,请求 INM 匹配 + IMS 过期 → 304 /both 同时有 ETag 与 Last-Modified,请求 INM 不匹配 + IMS 匹配 → 200 /both 同时有 ETag 与 Last-Modified,请求 只有 IMS 匹配 → 304 /both 同时有 ETag 与 Last-Modified,请求 INM 与 IMS 都匹配 → 304
上一篇:ETag 与条件请求;下一篇:Cookie 的读写过程。
GET /cc Cache-Control: max-age=600, public, must-revalidate GET /nostore Cache-Control: no-store, private Expires: Thu, 01 Oct 2026 13:00:00 GMT
GET /nosess → Vary: None | Set-Cookie: 无 GET /sess-read → Vary: Cookie | Set-Cookie: 无 GET /sess → Vary: Cookie | Set-Cookie: 有 GET /vary → Vary: Accept-Encoding, Accept-Language | Set-Cookie: 无
策略 第二次请求 Last-Modified + If-Modified-Since 发请求 → 304,正文 0 字节 max-age=600(强缓存) 浏览器直接用本地副本;期间服务器收不到请求(这一条是 HTTP 规范的约定,test client 无法演示)
/sess 的响应头: dict_keys(['Vary', 'Set-Cookie']) | Cache-Control = None (Flask 不会替你加)