Nginx中expires设负数会报错,无法禁用缓存;应组合设置Cache-Control: no-store,no-cache,must-revalidate,max-age=0、expires epoch和Pragma: no-cache。

在 Nginx 中,Expires 设置为负数并不能真正“禁用缓存”,这是一种常见误解。Nginx 的 expires 指令本身不接受负数值(如 expires -1s 会直接报错),更不会因此强制浏览器不缓存。真正实现禁用缓存,需组合使用多个响应头,核心是覆盖浏览器的默认缓存行为。
为什么 expires 负数无效?
Nginx 的 expires 指令只支持以下格式:
- 时间偏移量:如
expires 1h、expires max、expires epoch - 绝对时间:如
expires @15:00 - 不支持负数或负偏移(如
expires -1s)——配置会加载失败,Nginx 启动报错
正确禁用浏览器缓存的推荐配置
要让浏览器每次请求都回源(不读本地缓存),需同时设置三类关键响应头:
-
Cache-Control:优先级最高,明确指示缓存策略
→ 推荐:no-store, no-cache, must-revalidate, max-age=0 -
Expires:设为一个已过期的绝对时间
→ 推荐:expires epoch;(等价于Expires: Thu, 01 Jan 1970 00:00:01 GMT) -
Pragma:兼容 HTTP/1.0 客户端(如旧版 IE)
→ 推荐:add_header Pragma "no-cache";
完整 Nginx 配置示例(作用于特定 location):
location /api/ {
# 禁用缓存
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
expires epoch;
add_header Pragma "no-cache";
<pre class="brush:php;toolbar:false;"># 其他代理或后端配置...
proxy_pass http://backend;}
按场景选择更合理的策略
完全禁用缓存会影响性能,应按需选用:
- 敏感接口(登录、支付、实时数据):用上述严格禁用方案
-
静态资源(JS/CSS/图片):不建议禁用,应配合版本号或哈希值 + 长期缓存(
expires 1y;+Cache-Control public, immutable) -
需手动刷新的页面(如后台管理页):可仅设
Cache-Control: no-cache(允许缓存但强制校验)+ETag或Last-Modified
验证是否生效
部署后,用浏览器开发者工具(Network → 请求头)检查响应头是否包含:
Cache-Control: no-store, no-cache, must-revalidate, max-age=0Expires: Thu, 01 Jan 1970 00:00:01 GMTPragma: no-cache
同时发起两次相同请求,观察第二个请求的 Status 是否为 200(非 304 或 from cache),确认未走本地缓存。

















