在 HAProxy 中创建持久性 cookie

在 HAProxy 中创建持久性 cookie

我正在使用 HAProxy 进行 A/B 测试,下面是我的 HAProxy 配置片段

listen  http 127.0.0.1:8080
    maxconn 18000

    use_backend a-version-backend if { req.cook(SITEID) -m beg a_version }
    use_backend b-version-backend if { req.cook(SITEID) -m beg b_version } 
    default_backend ab-test

backend ab-test
    balance roundrobin
    cookie SITEID insert indirect nocache maxlife 48h

    server server1 10.0.0.2:80 weight 25 cookie a_version
    server server2 10.0.0.3:80 weight 25 cookie a_version
    server server3 10.0.0.4:80 weight 50 cookie b_version

阅读文档后,我意识到 HAProxy 只能创建会话 cookie。是否可以在 HAProxy 中创建持久 cookie?

====更新====

抱歉造成混淆,我的意思是持久性 cookie(更新了我的问题)https://en.wikipedia.org/wiki/HTTP_cookie#Persistent_cookie

这是由 HAProxy 设置的 cookie。它没有有效期,浏览器会将其视为会话 cookiehttps://en.wikipedia.org/wiki/HTTP_cookie#Session_cookie 会话 Cookie

会话 cookie 的问题在于,当用户关闭浏览器时,它会删除 cookie。这对于 A/B 测试来说是不可接受的,因为他们可能会在几天后再次访问网站,而分析跟踪会将他们视为不同的人。

这是 Facebook 持久性 cookie 的一个示例。它有一个有效期。 持久性 Cookie

答案1

我设法使用 Google Tag Manager 将 HAProxy 会话 cookie 转换为持久 cookie。

由于 GTM 在两个应用程序中都可用,我只需要创建 javascript 代码将 cookie 转换为持久 cookie。

以下是我在 GTM 中输入的代码:

<script type="text/javascript">
(function() {
  function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+d.toUTCString();
    document.cookie = cname + "=" + cvalue + "; " + expires + "; path=/";
  }

  function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i = 0; i < ca.length; i++) {
      var c = ca[i];
      while (c.charAt(0) == ' ') {
        c = c.substring(1);
      }
      if (c.indexOf(name) == 0) {
        return c.substring(name.length, c.length);
      }
    }
    return "";
  }

  if(getCookie('SITEID').length !== 0) {
    setCookie('SITEID', getCookie('SITEID'), 365);
  }
})();  
</script>

代码主要检查您是否有SITEIDcookie。如果您有 cookie,它会将有效期设置为一年。

相关内容