nginx 默认不缓存 return/rewrite 生成的重定向,仅缓存 proxy_pass 返回且满足 proxy_cache_valid、无禁用头、忽略 set-cookie 的 301/302 响应;需分层配置跳转逻辑与目标内容缓存。

Nginx 默认不缓存由 return 301、rewrite ... permanent 等指令直接生成的重定向响应,因为这类响应发生在请求处理早期,绕过了 proxy_cache 流程。真正可缓存、也值得缓存的,是重定向目标地址(即跳转后最终返回的内容),以及由后端服务返回的、带 Location 头的 301/302 响应——前提是它走 proxy_pass 且你显式启用了对应状态码的缓存规则。
要让 Nginx 有效缓存“带重定向跳转的响应内容”,关键不是缓存跳转动作本身,而是分两层协同配置:一层管“跳转逻辑是否快”,一层管“跳转后的内容是否稳”。
明确哪些重定向响应能被 proxy_cache 缓存
只有满足以下全部条件时,301/302 响应才会进入 proxy_cache:
- 响应必须来自
proxy_pass后端(不能是 Nginx 自己用return或rewrite生成的) - 对应状态码必须在
proxy_cache_valid中显式声明,例如:proxy_cache_valid 301 7d; proxy_cache_valid 302 5m;
- 后端响应头中不能含
Cache-Control: no-cache、private、no-store;若含,需加:proxy_ignore_headers Cache-Control;
- 若后端返回
Set-Cookie,默认会禁用缓存,需主动忽略:proxy_ignore_headers Set-Cookie;
用 map + return 实现“零开销跳转决策”
适用于大量固定路径映射(如旧文章 ID → 新 URL),把跳转判断提前固化:
map $request_uri $new_uri {
default "";
"/old-article-1.html" "/news/2024/001";
"/old-article-2.html" "/news/2024/002";
}
server {
location ~ ^/old-.*\.html$ {
if ($new_uri) {
return 301 $new_uri;
}
return 404;
}
}
这个过程不查磁盘、不调后端、不进缓存模块,CPU 开销极低,等效于“缓存了跳转规则”。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
让跳转目标内容可缓存(最实用的一环)
用户访问 /old-article-1.html → 301 跳到 /news/2024/001 → 这个新路径必须能被缓存:
location /news/ {
proxy_cache my_cache;
proxy_cache_valid 200 301 302 10m;
proxy_pass http://backend;
}
这样首次跳转后,后续直接访问 /news/2024/001 就命中缓存,完全绕过后端。
需要 proxy_redirect 配合的场景
当后端自己返回 302(比如登录跳转 /dashboard),但它的 Location 是内网地址或相对路径时,Nginx 必须先用 proxy_redirect 修正 Location 头,再决定是否缓存该响应:
location /auth/ {
proxy_pass http://auth-backend/;
proxy_redirect http://192.168.1.100:8080/ https://example.com/;
proxy_cache auth_redirect_cache;
proxy_cache_valid 302 2m; # 缓存修正后的跳转响应
}
注意:proxy_redirect 只改响应头,不影响缓存逻辑;但它确保缓存的是对外有效的跳转地址,而不是一个无效内网链接。
不复杂但容易忽略










