Nginx需在启用proxy_cache的location中分别配置proxy_cache_valid 301 7d和proxy_cache_valid 302 2m,确保永久重定向长期缓存、临时重定向短期缓存,并配合proxy_ignore_headers Cache-Control等指令覆盖后端干扰头。

要让 Nginx 对 301 和 302 重定向响应分别使用不同的缓存时长,关键不是“负载均衡缓存”,而是**在启用 proxy_cache 的 location 中,为每种状态码单独配置 proxy_cache_valid**。负载均衡(upstream)和缓存策略是正交的:前者决定请求发给谁,后者决定响应是否缓存、缓存多久——两者需协同配置,但不能混为一谈。
必须分开写 301 和 302 的缓存规则
301(永久重定向)语义上承诺长期有效,适合设为较长缓存(如 7d);302(临时重定向)表示状态可能随时变更,应设为较短时间(如 2m 或 30s)。Nginx 不会自动区分它们的缓存行为,除非你显式声明:
-
不能写成
proxy_cache_valid 301 302 5m;—— 这样两者共用同一时长,违背语义差异 -
不能依赖
proxy_cache_valid any 1m;覆盖 301/302 —— 它会被更精确的状态码规则覆盖,但若没写 301 规则,301 就可能不缓存或走 fallback - 正确做法是两行独立指令,顺序无关,Nginx 按状态码精确匹配
配置必须放在启用缓存的上下文中
proxy_cache_valid 只在已启用 proxy_cache 的 location 内生效。同时需确保:
- 已在
http块中定义了proxy_cache_path并命名缓存区(如my_cache_zone) - 对应 location 中启用了
proxy_cache my_cache_zone; - 若重定向依赖查询参数(例如
/old?ref=a→/new?ref=a),需自定义proxy_cache_key包含$args,否则不同参数可能命中同一缓存项
注意上游响应头对缓存的干扰
如果后端返回的 302 带有 Cache-Control: no-cache 或 no-store,Nginx 默认会尊重该头而跳过缓存。此时需添加:
proxy_ignore_headers Cache-Control; —— 强制忽略该响应头,使 proxy_cache_valid 302 2m 生效
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
同理,若需忽略 Expires 或 Set-Cookie 等头,也可一并加入 proxy_ignore_headers。
一个完整可用的 location 示例
适用于需要缓存旧路径重定向的场景(如 SEO 迁移):
location /old-path/ {<br> proxy_pass http://backend_servers;<br> proxy_cache my_cache_zone;<br> proxy_cache_valid 301 7d;<br> proxy_cache_valid 302 2m;<br> proxy_cache_valid 200 10m;<br> proxy_cache_key $scheme$host$request_uri$args;<br> proxy_ignore_headers Cache-Control;<br>}
其中 backend_servers 是已定义的 upstream 组,实现负载均衡;缓存策略则由各行 proxy_cache_valid 精确控制。

















