bigywater.tech
Flask · 45

Last-Modified 与缓存响应

页面应该怎么设置缓存头?Last-Modified 怎么比较?Flask 什么时候会自动加 Vary?带登录态的响应会不会被 CDN 缓存?这篇逐项实测。

Vary: Cookie
只要读取过 session,Flask 就会自动加的头
秒
If-Modified-Since 的比较精度
ETag 优先
两个条件头同时存在时的决定者

Last-Modified

实测 · 本机执行输出
  首次: 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 的读写过程。

Cache-Control 与 Expires

实测 · 本机执行输出
  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

Vary

实测 · 本机执行输出
  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 不会替你加)

分步演示

缓存响应
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:浏览器的启发式缓存(没有 Cache-Control 时按 Last-Modified 估算新鲜度)、CDN 的真实行为、Age 头、stale-while-revalidate 等扩展指令、与 Nginx proxy_cache 的配合
    京ICP备2026067502号-1京公网安备11010502063487号