在URL字符串中使用“utm_”会破坏Wordpress中的$ _GET变量

时间:2014-02-05 01:32:31

标签: php wordpress varnish

首先注意:此站点托管在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行。

托管中是否会出现导致此问题的内容?

3 个答案:

答案 0 :(得分:10)

如果其他人遇到同样的问题,就像我刚才那样,我通过实时聊天和WPEngine支持团队进行了交谈。他们在几分钟内纠正了它。

以下是我们聊天的简短记录:

  • 我:我正在尝试将一些GET变量放入一个cookie中,当访问$ _SERVER ['REQUEST_URI']全局变量时,它似乎适用于任意变量(如my_name = bob),但出于某种原因正在删除查询字符串中以“utm_”开头的内容。似乎是你身边的php / cache配置,你对此有何了解?
  • WPE:好问题;不幸的是,我不知道在查询中自动删除特定的args。让我和一些同事一起回顾一下。
  • 我:k。仅供参考,这是一个堆栈溢出问题http://stackoverflow ... -the-get-variable-in-wordpress。其他人的经历似乎也证实了这一点:https://twitter.com/ ... ey01 / status / 555584796785528832
  • WPE:这是您的安装:?
  • 我:是的
  • WPE:我可以请你现在试试吗?
  • 我:好的,现在有效。问题是什么?
  • WPE:太棒了!问题是我们默认删除了“utm_”arg。我为没有意识到你建议的arg而道歉。我不得不从我们的缓存系统中排除这个arg。
  • 我:好的,所以我自己无法做到这一点对吗?
  • WPE:这是正确的。

参考链接: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);
    }

  }
}