Php 拥有;utm“;在URL中,字符串打断Wordpress中的$\u GET变量

Php 拥有;utm“;在URL中,字符串打断Wordpress中的$\u GET变量,php,wordpress,varnish,Php,Wordpress,Varnish,第一个注意事项:该站点托管在WPEngine(varnish缓存)上,但我似乎无法在另一台服务器上复制该问题 我们需要能够在某些页面上访问$\u GET php变量。为了进行测试,我修改了我们的Wordpress header.php,以便在第一行进行var_转储 正常情况下,一切正常。但是,如果URL字符串包含“utm”,则$\u GET中的每个后续变量都会被剥离。更奇怪的是,如果我登录到Wordpress,一切正常 我们的Paypal返回URL如下所示: utm_nooverride导致$

第一个注意事项:该站点托管在WPEngine(varnish缓存)上,但我似乎无法在另一台服务器上复制该问题

我们需要能够在某些页面上访问$\u GET php变量。为了进行测试,我修改了我们的Wordpress header.php,以便在第一行进行var_转储

正常情况下,一切正常。但是,如果URL字符串包含“utm”,则$\u GET中的每个后续变量都会被剥离。更奇怪的是,如果我登录到Wordpress,一切正常

我们的Paypal返回URL如下所示:

utm_nooverride导致$_GET为空数组。如果我将其更改为“test=1&tx=xxxxyyyy”,则其工作正常。如果我使用“utm_test=1&tx=xxxxyyyy”,我会再次得到一个空数组

在.htaccess中没有什么奇怪的地方,只有一些标准的Wordpress行

主机中是否存在导致此问题的原因?

WP引擎可能(错误)配置了Varnish,以便在引用Google Analytics活动变量时忽略查询字符串参数。他们可能这样做是为了在不使用查询字符串的情况下引用页面缓存,因为活动变量是由analytics provider从客户端(而不是服务器端)读取的。因此,在服务器端忽略这些变量表面上没有任何效果,这将提高大量使用入站谷歌分析跟踪的网站的性能


我说这是可能的,因为有一个堆栈溢出问题,询问如何做到这一点:。唯一确定的方法是联系WP Engine。

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

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

  • Me:我试图将一些GET变量放入cookie中,在访问$\u SERVER['REQUEST\u URI']全局变量时,它似乎适用于任意变量(如my\u name=bob),但由于某些原因,查询字符串中以“utm\u”开头的任何内容都被删除了。似乎是一个php/缓存配置在您这边,你知道这方面的事情吗
  • WPE:好问题;不幸的是,我不知道有什么东西会自动剥离查询中的特定参数。让我和一些同事一起回顾一下
  • 我:k。仅供参考,这里有一个堆栈溢出问题…-wordpress中的get变量。其他人的经验似乎也证实了这一点:…ey01/status/555584796785528832
  • WPE:这是为您的安装:
  • 我:是的
  • 我可以请你现在试一试吗
  • 我:好的,现在可以了。问题是什么
  • 太好了!问题是我们在默认情况下去掉了“utm_”参数。我很抱歉没有意识到你所建议的arg。我不得不从缓存系统中排除这个arg
  • 我:好吧,那我不可能自己做对吗
  • WPE:没错

参考链接:

我目前正在与WPEngine聊天,希望解决这个问题

WPEngine的varnish缓存实际上去掉了utm_uu和gclid_u参数,以改进缓存。不幸的是,在识别出第一个utm_uu或gclid_u参数后,WPEngines实现的这个“特性”去掉了所有后续查询参数

例如,URL:

您希望服务器接收的内容:

服务器实际接收的内容:

请注意,page=1参数是如何删除的,即使它不是utm_uu或gclid_uu参数

WPEngine建议的解决方法是将utm_uu和gclid_u应用于缓存排除列表,但这意味着如果url中存在utm_uu或gclid_u参数,则不会提供缓存。这似乎不太理想,因为如果一个URL有一个utm_uu或gclid_uu参数,那么它很可能来自一封电子邮件,而发送大量电子邮件意味着流量激增,而这正是您希望为缓存页面提供服务的时候

下面是一些javascript,用于检测URL中是否有utm_uu或gclid_u,如果是,则重新排列URL,使utm_u和gclid_u参数位于查询字符串的末尾,然后触发页面重定向。下面的代码专门查找名为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);
    }

  }
}

你可能想直接使用google ga对象并发送提取的URL变量。在这个问题提出后不久,我与他们进行了一次准确的对话,但忘了在这里发布。谢谢伙计:)谢谢,这帮我建立了一个网站