必须在启用缓存的 location 块中配置 proxy_ignore_headers Expires; 并配 proxy_cache_valid,才能使 Nginx 忽略后端错误的 Expires 头(如 1970-01-01),按自定义规则缓存;该指令须紧接 proxy_pass、大小写敏感、仅限 location 块生效。

直接在启用缓存的 location 块中写 proxy_ignore_headers Expires;,再配 proxy_cache_valid 显式指定缓存时间,Nginx 就不再受后端返回的过期时间(比如 Expires: 1970-01-01 或过去时间)影响,完全按你定义的规则缓存——这不是绕过,而是把决策权拿回来。
为什么必须忽略 Expires 头
后端常因框架默认、调试残留或兼容旧逻辑,返回错误的 Expires 值:
- 设为 Unix 零点(
Expires: Thu, 01 Jan 1970 00:00:00 GMT)或任意已过期时间,Nginx 默认判定“不可缓存” - 即使内容本身稳定(如静态资源、公共配置接口),也会被强制跳过缓存
- 该头不参与
proxy_cache_valid判断,只要存在且过期,就直接否决缓存
正确配置位置和写法
该指令必须紧贴 proxy_pass,且位于同一 location 块内:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 写在
proxy_pass之后、proxy_cache相关指令之前最稳妥 - 大小写敏感,必须写成
Expires(首字母大写,无引号、无逗号) - 不能写在
http或server全局块,只对当前 location 生效 - 示例:
location /static/ {
proxy_pass http://backend;
proxy_ignore_headers Expires;
proxy_cache my_cache;
proxy_cache_valid 200 302 1h;
}
配套动作确保策略落地
单写 proxy_ignore_headers Expires 不够,还需防止干扰透传和策略冲突:
- 加
proxy_hide_header Expires;:避免后端返回的错误Expires透传给客户端 - 用
add_header Expires "" always;:主动清空该头,避免浏览器误读 - 禁用 Nginx 自动注入:
expires off;,防止与你手动控制冲突 - 务必配
proxy_cache_valid,例如proxy_cache_valid 200 1h;,否则忽略后仍无缓存依据
验证是否生效
检查响应头和缓存行为是否符合预期:
- 用
curl -I看响应中是否还有Expires头——有则proxy_hide_header没起作用 - 观察
X-Cache头(如HIT或MISS),确认缓存已命中 - 反复请求同一 URL,看响应时间是否明显下降,且服务端日志不再频繁触发
- 注意:
proxy_ignore_headers是“无视”,不是“删除”,原始头仍在响应体里,只是 Nginx 缓存模块不读它

















