首先注意:此站点托管在WPEngine(清除缓存)上,但我似乎无法在另一台服务器上复制该问题。
我们需要能够在某些页面上访问$ _GET php变量。为了测试,我修改了我们的Wordpress header.php,在第一行做了一个var_dump。
通常,一切正常。但是,如果URL字符串包含“utm_”,则$ _GET中的每个后续变量都将被删除。更奇怪的部分是,如果我登录到Wordpress,一切正常。
我们的Paypal返回网址如下所示:
http://oururl.com/buy/thankyou/?utm_nooverride=1tx=xxxxyyyy ...
utm_nooverride导致$ _GET为空数组。如果我将其更改为“test = 1& tx = xxxxyyyy”,则可以正常工作。如果我使用“utm_test = 1& tx = xxxxyyyy”,我会再次获得一个空数组。
.htaccess中没有什么奇怪的,只有几个标准的Wordpress行。
托管中是否会出现导致此问题的内容?
答案 0 :(得分:10)
如果其他人遇到同样的问题,就像我刚才那样,我通过实时聊天和WPEngine支持团队进行了交谈。他们在几分钟内纠正了它。
以下是我们聊天的简短记录:
参考链接:https://wpengine.com/support/utm-gclid-variables-caching/
答案 1 :(得分:2)
WP引擎可能(错误)配置了Varnish,以便在引用Google Analytics广告系列变量时忽略查询字符串参数。他们可能已经这样做了,因此他们可以在没有查询字符串的情况下引用页面的缓存,因为分析提供者会在客户端(而不是服务器端)读取活动变量。因此,忽略服务器端的这些变量表面上可能没有效果,并且会提高大量使用入站Google Analytics跟踪的网站的性能。
我说这是可能的,因为有一个Stack Overflow问题,询问如何做到这一点:"Stripping out select querystring attribute/value pairs so varnish will not vary cache by them"。唯一可以确定的方法是联系WP引擎。
答案 2 :(得分:0)
我目前正在与 WPEngine 聊天,希望能解决这个问题。
WPEngine 的 varnish 缓存实际上去除了 utm_ 和 gclid_ 参数以改进缓存。遗憾的是,在识别第一个 utm_ 或 gclid_ 参数后,WPEngines 对该“功能”的实现会删除所有后续查询参数。
例如网址: www.example.com/test/?foo=bar&utm_source=email&page=1
您希望您的服务器收到什么: www.example.com/test/?foo=bar&page=1
您的服务器实际收到的内容: www.example.com/test/?foo=bar
注意 page=1 参数是如何被删除的,即使它不是 utm_ 或 gclid_ 参数。
WPEngine 建议的解决方法是将 utm_ 和 gclid_ 应用于缓存排除列表,但这意味着如果您的 url 中有 utm_ 或 gclid_ 参数,则不会提供缓存。这似乎不太理想,因为 URL 有一个 utm_ 或 gclid_ 参数,它很可能来自电子邮件,并且发送大量电子邮件意味着流量激增,而这正是您想要提供缓存页面的时候。
下面是一些 javascript,它检测 utm_ 或 gclid_ 是否在 URL 中,如果是,它会重新排列 url,以便 utm_ 和 gclid_ 参数位于查询字符串的末尾,然后触发页面重定向。下面的代码专门查找名为 tfa_next 的参数,该参数是通过 FormAssembly 重定向添加到 URL 末尾的参数。下面的代码可以改进为更通用,但我希望它可以作为任何需要它的人的起点。
const params = new URLSearchParams(window.location.search);
var newParams = "";
console.log("This is working");
if(params.has('tfa_next')){
console.log("it has a tfa_next param");
if(window.location.href.includes("UTM_") || window.location.href.includes("utm_") || window.location.href.includes("GCLID_") || window.location.href.includes("gclid_")){
console.log("it has a utm param");
var count = 0;
for(const [key, value] of params) {
if(count == 0 && key == "tfa_next"){
break;
} else {
count += 1;
}
if(key.includes("UTM_") || key.includes("utm_") || key.includes("GCLID_") || key.includes("gclid_")){
newParams = newParams + key + "=" + encodeURIComponent(value) + "&";
} else {
newParams = key + "=" + encodeURIComponent(value) + "&" + newParams;
}
console.log("NewParams: " + newParams);
}
if(newParams.slice(newParams.length - 1) == "&"){
newParams = newParams.slice(0, newParams.length - 1);
console.log("final query string: " + newParams);
}
if (count > 0) {
console.log("end result: " + window.location.protocol + "//" + window.location.hostname + window.location.pathname + "?" + newParams);
window.location.replace(window.location.protocol + "//" + window.location.hostname + window.location.pathname + "?" + newParams);
}
}
}