我目前正在与 WPEngine 聊天,希望能解决这个问题。
WPEngine 的清漆缓存实际上去除了 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);
}
}
}