Nginx 反向缓存 301 重定向(永久)

Nginx 反向缓存 301 重定向(永久)

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,它会自动使用和缓存文件ExpiresCache-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值,具体顺序为:

  1. X-Accel-Expires
  2. 过期/缓存控制
  3. proxy_cache_valid

参考:HttpProxy模块Nginx 反向代理 + URL 重写

相关内容