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

ano*_*one 4 nginx cache reverse-proxy querystring

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

file.php?parameter=one&paramater2=two&r=EPOCHTIMESTAMP
Run Code Online (Sandbox Code Playgroud)

查询字符串参数“参数”因请求而异。“paramater2”也是如此。

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

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

谢谢。

ano*_*one 5

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

正确的做法是使用 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;
      }
    }
  ...
}
Run Code Online (Sandbox Code Playgroud)

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