通过 HTTP headers 或 url 中的 * 使清漆无效
Invalidate varnish by HTTP headers or by * in url
所以我有一些 url 像这样 www.example.com/userID/productID
这个 url 设置这个 HTTP headers X-Cache-Tags: product-productID, user-userID, product
现在我想清除 X-Cache-Tags
为 product-productID
的所有缓存,或者我想清除所有 www.example.com/*/productID
的 url
这可能吗?
这是实现它所需的 VCL 代码:
vcl 4.0;
acl purge {
"localhost";
"192.168.55.0"/24;
}
sub vcl_recv {
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return(synth(405));
}
if(!req.http.x-invalidate-tag && !req.http.x-invalidate-pattern) {
return(purge);
}
if(req.http.x-invalidate-tag) {
ban("obj.http.X-Cache-Tags ~ " + req.http.x-invalidate-tag);
} else {
ban("obj.http.x-url ~ " + req.http.x-invalidate-pattern
+ " && obj.http.x-host == " + req.http.host);
}
return (synth(200,"Ban added"));
}
}
sub vcl_backend_response {
set beresp.http.x-url = bereq.url;
set beresp.http.x-host = bereq.http.host;
}
sub vcl_deliver {
unset resp.http.x-url;
unset resp.http.x-host;
}
有 3 种方法可以使用此 VCL 从缓存中删除内容:
- 清除个人 URL
- 禁止所有 object 匹配缓存标签的内容
- 禁止 URL 与模式匹配的所有 objects
清除URL
当具有批准的客户端 IP 的请求执行 PURGE
请求时,仅使用确切的 URL 从缓存中删除 object:
curl -XPURGE http://example.com/20/100
禁止使用缓存标签
以下 curl
请求将从缓存中删除所有 object 具有包含标记 product-10
的 X-Cache-Tags
响应 header 的所有 object:
curl -XPURGE -H "x-invalidate-tag: product-10" http://example.com/
禁止使用 URL 模式
以下 curl
请求将从缓存中删除产品 10
的所有 object,对于所有用户:
curl -XPURGE -H "x-invalidate-pattern: ^/[0-9]+/10/?$" http://example.com/
结论
只要你的VCL足够灵活,你可以使用各种机制和规则来使缓存失效。
如 VCL 示例中所述,请通过 ACL 保护对内容失效的访问。您还可以添加额外的保护,例如密码身份验证或防火墙。
所以我有一些 url 像这样 www.example.com/userID/productID
这个 url 设置这个 HTTP headers X-Cache-Tags: product-productID, user-userID, product
现在我想清除 X-Cache-Tags
为 product-productID
的所有缓存,或者我想清除所有 www.example.com/*/productID
这可能吗?
这是实现它所需的 VCL 代码:
vcl 4.0;
acl purge {
"localhost";
"192.168.55.0"/24;
}
sub vcl_recv {
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return(synth(405));
}
if(!req.http.x-invalidate-tag && !req.http.x-invalidate-pattern) {
return(purge);
}
if(req.http.x-invalidate-tag) {
ban("obj.http.X-Cache-Tags ~ " + req.http.x-invalidate-tag);
} else {
ban("obj.http.x-url ~ " + req.http.x-invalidate-pattern
+ " && obj.http.x-host == " + req.http.host);
}
return (synth(200,"Ban added"));
}
}
sub vcl_backend_response {
set beresp.http.x-url = bereq.url;
set beresp.http.x-host = bereq.http.host;
}
sub vcl_deliver {
unset resp.http.x-url;
unset resp.http.x-host;
}
有 3 种方法可以使用此 VCL 从缓存中删除内容:
- 清除个人 URL
- 禁止所有 object 匹配缓存标签的内容
- 禁止 URL 与模式匹配的所有 objects
清除URL
当具有批准的客户端 IP 的请求执行 PURGE
请求时,仅使用确切的 URL 从缓存中删除 object:
curl -XPURGE http://example.com/20/100
禁止使用缓存标签
以下 curl
请求将从缓存中删除所有 object 具有包含标记 product-10
的 X-Cache-Tags
响应 header 的所有 object:
curl -XPURGE -H "x-invalidate-tag: product-10" http://example.com/
禁止使用 URL 模式
以下 curl
请求将从缓存中删除产品 10
的所有 object,对于所有用户:
curl -XPURGE -H "x-invalidate-pattern: ^/[0-9]+/10/?$" http://example.com/
结论
只要你的VCL足够灵活,你可以使用各种机制和规则来使缓存失效。
如 VCL 示例中所述,请通过 ACL 保护对内容失效的访问。您还可以添加额外的保护,例如密码身份验证或防火墙。