NGINX 代理缓存 - 查询字符串中的缓存破坏变量 - 可以忽略吗?

NGINX 代理缓存 - 查询字符串中的缓存破坏变量 - 可以忽略吗?

我们有以下想要代理缓存的 URL:

file.php?parameter=one&paramater2=two&r=EPOCHTIMESTAMP

查询字符串参数“parameter”在请求之间会有所不同。“paramater2”也是如此。

查询字符串参数 r 是我们用来确保客户端不提供缓存(在客户端)内容的时间戳。又称“缓存破坏者”。是的,我们还使用所有适当的不缓存 h 标头。

现在,我们想通过 nginx 代理缓存其中一些请求。是否可以指示 nginx 在为条目设置缓存键时忽略 r 查询字符串参数,但使用所有其他参数?如果我们不能忽略参数 r,那么 nginx 代理缓存将毫无用处,因为每个缓存键都是唯一的。

谢谢。

答案1

我们已经找到了这个问题的解决方案。

正确的方法是使用 nginx$arg_...变量构造缓存键。$arg_...将包含查询字符串参数。因此在上面的示例中,我们将在缓存键中使用$arg_parameter和。$arg_parameter2

结果如下nginx.conf

http {
  ...
    server {
      location / {
         ...
         proxy_cache_key $scheme$proxy_host$uri$is_args$arg_parameter$arg_parameter2;
      }
    }
  ...
}

请注意,包含连字符(破折号)的查询字符串参数(例如data-*参数)不适用于该$arg_paramName语法。可以在以下位置找到使用 Lua 的解决方法这个帖子

相关内容