根据是否使用特定的查询字符串,我们的 WordPress 网站的每个页面和帖子都有多个视图。
例如,如果访问example.com/blog-post-with-chart
(包含图表作为正文内容的页面),您将看到整个页面。导航栏、内容、页脚……一切。
然而,如果你去example.com/blog-post-with-chart/
?查看=嵌入那么除了图表之外的所有内容都会被删除。所以您只能看到图表。其他网站可能会这样嵌入我们的图表。
WordPressget_query_var('view')
没有返回任何内容。我还尝试过仅使用 var_dump 或 print_r $_GET 超全局变量,但也没有显示任何内容。
我注意到,只有当“view”是第一个查询字符串参数时,这才不起作用。所以如果我的 URL 是example.com/blog-post-with-chart/
?fake=arg&view=embed那么图表视图将按预期工作。
看起来 Varnish 正在删除传递给服务器的查询参数。如果我添加查询参数“nocache”,那么一切都会按预期进行。这是因为我有一个 Vanish 规则:
if (req.url ~ "nocache") {
set req.backend = default;
return(pass);
}
作为一种解决方法,我添加了一条新规则,如果 URL 包含以下内容,则绕过缓存视图=
if ( req.url ~ "view=" ) {
set req.backend = default;
return(pass);
}
但是我怎样才能阻止 Varnish “丢弃”查询参数呢?我们肯定希望缓存该页面,并且我们还希望它与查询字符串一起缓存,以便始终缓存嵌入视图。
编辑-这是我正在使用的 VCL 文件: https://gist.github.com/kyle-jennings/589e513808fa83b93a27d1cf3c10c642
答案1
如果查询字符串开头有“view”,则基本上要求 varnish 清理每个查询参数:
if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {
set req.url = regsub(req.url, "\?.*$", "");
}
因此...它符合