/swatches/ajax/media/?product_id=17620&isAjax=true&_=1524469655019
我需要使用varnish缓存此请求,但我需要忽略最后一个查询参数_=1524469655019
。
我不确定varnish内部是如何工作的,但我想它会从请求的url中生成缓存uid密钥。所以在我的情况下,它只需要从这个URL创建uid键
/swatches/ajax/media/?product_id=17620&isAjax=true
执行req.url ~ "^/swatches/(.*)$"
之类的操作无效,因为varnish仍然会使用整个url来缓存uid。
答案 0 :(得分:0)
从QS中删除_=
。
sub vcl_recv {
set req.url = regsuball(req.url,"\?_=[^&]+$",""); # strips when QS = "?_=AAA"
set req.url = regsuball(req.url,"\?_=[^&]+&","?"); # strips when QS = "?_=AAA&foo=bar"
}
请记住,这将剥离QS - 并且QS不会转发到后端。
如果您在后端需要它,则需要在vcl_hash
请注意,如果您有自定义vcl_hash,要包含默认规则,因为自定义会删除默认哈希参数。
http.host || client.ip
VCL哈希是生成cache-uuid
的部分
sub vcl_hash {
set req.http.hash_url = regsuball(req.url,"\?_=[^&]+$",""); # strips when QS = "?_=AAA"
set req.http.hash_url = regsuball(req.http.hash_url,"\?_=[^&]+&","?"); # strips when QS = "?_=AAA&foo=bar"
hash_data(req.http.hash_url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
}
这样,产生MISS
的请求也会将_=
传递给后端。
在这么简单的情况下,没有明确需要vmod。