![Nginx 反向缓存 301 重定向(永久)](https://linux22.com/image/595029/Nginx%20%E5%8F%8D%E5%90%91%E7%BC%93%E5%AD%98%20301%20%E9%87%8D%E5%AE%9A%E5%90%91%EF%BC%88%E6%B0%B8%E4%B9%85%EF%BC%89.png)
Nginx 是否可能缓存所有301
重定向请求proxy_pass
?
例如:
请求#1:客户端 A 请求 /some/path->发送到proxy_pass
->导致 301 重定向到/some/other/path
-> nginx 缓存此响应,因为它是 301 重定向。
请求 #2:客户端 B 请求 /some/path -> nginx 返回缓存的 301 重定向到/some/other/path
。
答案1
nginx 已经可以缓存 301 重定向。您可以使用proxy_cache_valid指示:
proxy_cache_valid 301 365d; # Cache permanent redirects for a whole year
答案2
我发现@Michael的答案帮助我解决了大部分问题,但是当我打开时proxy_cache
,它会自动使用和缓存文件Expires
。Cache-Control
所以我最终得到了这个解决方案。
proxy_cache_path /tmp/nginx levels=1:2 keys_zone=main-cache:8m max_size=1000m inactive=600m;
proxy_temp_path /tmp/nginx/tmp;
proxy_cache main-cache;
proxy_cache_valid 301 60m;
proxy_cache_key "$scheme://$host$request_uri";
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
答案3
如果你想要重定向全部,你可以使用以下方式:
location / {
proxy_pass http://127.0.0.1:8080/VirtualHostBase/https/$server_name:443/some/path/VirtualHostRoot;
}
rewrite
您的示例可能需要和的组合proxy_pass
:
location / {
rewrite ^(.*)$ /VirtualHostBase/https/$server_name:443/some/path/VirtualHostRoot$1 break;
proxy_pass http://127.0.0.1:8080;
}
警告:你得到了不同的重写redirect
效果:break
返回 301 而不是permanent
返回 302。
编辑
您需要在此模块上游使用proxy_cache_valid
指令:
proxy_cache_valid 301 1h;
警告,上游缓存相关指令的优先级高于proxy_cache_valid值,具体顺序为:
- X-Accel-Expires
- 过期/缓存控制
- proxy_cache_valid