Nginx 代理缓存 301 重定向但忽略查询字符串

Nginx 代理缓存 301 重定向但忽略查询字符串

我们有很多基于广告的流量,它们在 URL 上传递各种查询字符串参数,但这些不会影响页面的内容/输出。

我目前有以下 nginx 代理缓存配置,它将未缓存的请求传递给另一个实际返回内容的后端服务器。

proxy_cache_key    "$request_method@$scheme://$host:$server_port$uri";
proxy_cache_valid  200 15m;
proxy_pass         http://backend;

我只是在缓存键中使用了$uri而不是,$args这样以下两个键都可以从同一个缓存中提取,效果很好

http://www.somedomain.com/?aid=129f58ad4af8f9de08bbd6bb7df22850
http://www.somedomain.com/?aid=4db00563d4181dc8d1dfd3b5cd6dc708

但是,如果我开始缓存来自后端服务器的 301 重定向响应

proxy_cache_valid  301 15m;

然后我们开始缓存从后端服务器返回的 301,使用无参数缓存键,但这会导致问题,因为:

    the first request to

http://somedomain.com/?aid=129f58ad4af8f9de08bbd6bb7df22850
redirects to...
http://www.somedomain.com/?aid=129f58ad4af8f9de08bbd6bb7df22850

but
http://somedomain.com/ or http://somedomain.com/?foo=bar
pulls from the cache and redirects to...
http://www.somedomain.com/?aid=129f58ad4af8f9de08bbd6bb7df22850

有没有办法让 301 重定向缓存忽略查询字符串并仅传递请求中存在的任何查询字符串参数?

答案1

恐怕没有办法实现您的要求。问题在于您的后端使用查询参数发出 301 响应,而 nginx 没有方法修改保存到缓存中的 HTTP 响应。

您唯一的选择是使用aid作为附加缓存键。

答案2

根据这些 URL 的语义,我认为最好 nginx 根本不要尝试缓存这些请求;而是始终将它们传递给您的应用程序,以便您可以进行适当的跟踪。

幸运的是,这是一行代码:

proxy_no_cache $arg_aid;

aid如果参数存在于查询字符串中,将绕过 nginx 缓存并将请求传递给您的应用程序。

相关内容