我们有以下想要代理缓存的 URL:
file.php?parameter=one¶mater2=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 的解决方法这个帖子。