如何使用清漆缓存忽略特定的查询参数?
How to ignore specific query parameter with varnish cache?
/swatches/ajax/media/?product_id=17620&isAjax=true&_=1524469655019
我需要用清漆缓存这个请求,但我需要忽略最后一个查询参数_=1524469655019
。
我不确定 varnish 内部是如何工作的,但我想它会根据请求的 url 生成缓存 uid 键。所以在我的例子中,它只需要从这个 url
创建 uid 键
/swatches/ajax/media/?product_id=17620&isAjax=true
做类似 req.url ~ "^/swatches/(.*)$"
的事情是行不通的,因为 varnish 仍然会使用整个 url 作为缓存 uid。
只需从 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
中做
beware if you have a custom vcl_hash, to include the default rules, as the custom removes the default hash parameters.
http.host || client.ip
VCL hash is the part the generates the 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。
/swatches/ajax/media/?product_id=17620&isAjax=true&_=1524469655019
我需要用清漆缓存这个请求,但我需要忽略最后一个查询参数_=1524469655019
。
我不确定 varnish 内部是如何工作的,但我想它会根据请求的 url 生成缓存 uid 键。所以在我的例子中,它只需要从这个 url
创建 uid 键/swatches/ajax/media/?product_id=17620&isAjax=true
做类似 req.url ~ "^/swatches/(.*)$"
的事情是行不通的,因为 varnish 仍然会使用整个 url 作为缓存 uid。
只需从 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
beware if you have a custom vcl_hash, to include the default rules, as the custom removes the default hash parameters.
http.host || client.ip
VCL hash is the part the generates the 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。