使用查询字符串参数缓存内容Varnish对URL进行哈希运算,并将此值用作其缓存键。当URL中的单个值更改时,缓存键也会更改。这将导致缓存未命中。
查询字符串参数极易发生这种情况:省略参数、添加参数或更改参数顺序可能会导致缓存未命中。
添加以下VCL片段将确保查询字符串参数按字母顺序排序,这将提高命中率:
import std;
sub vcl_recv {
set req.url = std.querysort(req.url);
}
动态徽标
VCL 编程语言使您能够灵活地决定如何在边缘做出某些决策。尽管缓存了值,或者源服务器返回了某个值,但您仍然可以通过编写一些VCL代码来更改客户端看到的内容。
实际上,您可以捕获对徽标的请求,并且仍然可以在内部将请求重新路由到不同的URL。您甚至可以内省查询字符串参数来组成动态徽标的URL。
实现这一点所需的VCL代码取决于许多因素。由您来描述这些规则和所需的逻辑。
清理JS库用于跟踪的UTM参数查询字符串参数可以在VCL中剥离。源服务器不需要它们来呈现页面,添加这些参数只会导致更多的缓存未命中。
以下是一些VCL来清理您的URL:
sub vcl_recv {
# Remove tracking parameters
if (req.url ~ "(\\?|&)(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=") {
set req.url = regsuball(req.url, "&(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\\-\\.%25]+)", "");
set req.url = regsuball(req.url, "\\?(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\\-\\.%25]+)", "?");
set req.url = regsub(req.url, "\\?&", "?");
set req.url = regsub(req.url, "\\?$", "");
}
# Strip HTML anchors
if (req.url ~ "\\#") {
set req.url = regsub(req.url, "\\#.*$", "");
}
# Strip a trailing ? if it exists
if (req.url ~ "\\?$") {
set req.url = regsub(req.url, "\\?$", "");
}
}
首先,使用
regsuball()
查找并替换调用下一步是从URL中删除HTML锚定,最后我们删除后面的问号,因为它们意味着没有使用查询字符串参数摘要VCL有必要的语法来解决您的问题。您可能会使用
regsub()
和
regsuball()
用于从URL中删除众所周知的垃圾,以确保更好的命中率。
您也可以使用VCL执行动态决策,但在我们讨论VCL实现之前,您必须描述必要的逻辑和规则。