Nginx 网关层需配置 proxy_ignore_headers Expires 以绕过上游不合理 Expires 头,使其缓存决策仅依赖 proxy_cache_valid;同时须配齐 proxy_cache_path、proxy_cache、proxy_cache_valid 等指令,并建议添加 proxy_hide_header Expires 和 add_header Cache-Control 防止客户端误解。
要让 Nginx 网关层绕过上游返回的不合理 Expires 头(比如设为 1970-01-01 或过去时间),从而激活高性能路径缓存,关键不是删掉这个头,而是让 Nginx 在做缓存决策时彻底“不看它”——proxy_ignore_headers Expires 就是这把钥匙。
上游服务(如 Node.js、Python 应用)常默认设置 Expires: 0 或 Expires: Thu, 01 Jan 1970 00:00:00 GMT,Nginx 一看到这种已过期时间,会直接跳过缓存,哪怕资源本身完全静态、永不变化。忽略后,Nginx 就不再拿这个头做判断,转而只认你配置的 proxy_cache_valid。
单独写 proxy_ignore_headers Expires 不会自动开启缓存。它只是移除了一个障碍,后续必须显式启用缓存逻辑:
http 块中已定义 proxy_cache_path(例如:proxy_cache_path /var/cache/nginx/mycache levels=1:2 keys_zone=mycache:10m max_size=1g;)location 块中启用缓存:proxy_cache mycache;
proxy_cache_valid 200 301 302 1h;(不要用通配符 200 1h,避免遗漏关键状态码)proxy_ignore_headers Expires 必须写在 proxy_pass 之前,且与上述指令同属一个 location 块忽略 Expires 后,响应头仍会原样透传给客户端,可能造成前端误解。建议同步隐藏它:
proxy_hide_header Expires;,防止客户端被错误头误导add_header Cache-Control "public, max-age=3600";(注意:此头仅影响客户端,不影响 Nginx 缓存决策)Set-Cookie 或 Vary
配置完成后,用 curl 观察两个关键信号:
Expires(说明是“忽略”而非“删除”)X-Cache-Status: HIT 或 MISS(说明缓存机制已介入)