当查询字符串为空时如何禁用代理缓存?

当查询字符串为空时如何禁用代理缓存?

使用 nginx 我有

server {
  listen 1.2.3.4:80
  proxy_cache_valid       200 302 5m;
  location /  {
    try_files $uri @upstream;
    root $root;
  }
}

当我访问时,http://example.com/foobar它会生成一个依赖于访问者的重定向http://example.com/foobar?filter_distance=50&...,因此我不想缓存此重定向。当查询字符串为空时,我需要绕过缓存。我有点迷茫,因为location /foobar会匹配两者。

答案1

我补充道

map $request_uri $nocache {
  /foobar 1;
}

到 http 部分并

proxy_cache_bypass $nocache;
proxy_no_cache $nocache;

到服务器部分。这似乎有效。

答案2

您应该像这样使用proxy_cache_bypass和指令:proxy_no_cache

set $nocache 0;

if ($arg_filter_distance = "") {
    set $nocache 1;
}

proxy_cache_bypass $nocache;
proxy_no_cache $nocache;

proxy_no_cachefrom的定义nginx 文档

定义响应不会保存到缓存的条件。如果字符串参数中至少一个值不为空且不等于“0”,则不会保存响应:

这里我们测试 filter_distance GET 参数是否为空。如果为空,我们将 $nocache 设置为 1,然后proxy_cache_bypassproxy_no_cache指令将生效。

您可以类似地添加其他 GET 参数,例如$arg_filter_type,如果您有一个filter_typeGET 参数。

相关内容