如何让 HAProxy 覆盖/标准化跨多个后端的 cookie 分配?

如何让 HAProxy 覆盖/标准化跨多个后端的 cookie 分配?

我正在运行 HAProxy 版本 2.0.12 2019/12/21 - 它托管多个后端。

在 Web 层,我有一个持久性 Cookie,它只包含一个 GUID,并且旨在具有超长寿命(50 年,但可以是任何大值)。它需要在用户遇到的第一个页面以一致的方式设置,但目前由多个后端以不一致的方式设置 - 我希望 HAProxy 覆盖并管理它。

要求:

  • 对于其中的每一个,我需要能够处理 .es、.co.uk、.com.au 和 .com 域。
  • 如果现有值以正确的设置进入 HAProxy
    • 什么也不要做,一切都好。
  • 如果现有值以不正确的设置进入 HAProxy,请提取 GUID,并使用正确的设置重新发出。
    • 忽略后端响应
    • 改变www.my-domain.com到 .my-domain.com
    • 如果不是,则更改为安全
    • 如果有其他情况则更改为 SameSite=Lax
    • 删除 HttpOnly(如果已设置)
  • 如果 HAProxy 没有传入 cookie,并且后端没有返回 set-cookie 标头,则设置一个新的 cookie
    • 添加 my-cookie-name,包含新的 GUID。
    • 安全的
    • Samesite=Lax
    • 域名=.my-domain.com
  • 如果没有 cookie 进入 HAProxy,但后端确实为 my-cookie-name 定义了 set-cookie 标头
    • 提取 GUID,并确保:
    • 安全的
    • Samesite=Lax
    • 域名=.my-domain.com

期望的输出是(可能是):

set-cookie: my-cookie-name=55e77c42-377a-4c32-9de6-da5ab4430bb3; expires=Wed, 05-Feb-2070 23:59:59 GMT; path=/; domain=.my-domain.com; samesite=lax; Secure

我遇到的问题是,我希望此 cookie 覆盖将域设置为顶级域,但到目前为止,我找不到hdr_end在“set-var”中使用的方法。我发现的唯一选项是使用 regsub(),但这意味着“.co.uk”或“.com.au”顶级域与“.com”顶级域的逻辑不同。我觉得我一定是错过了什么,试图将域名处理编码到反向代理中 :-) 我错过了什么吗?我应该使用不同的方法吗?

先前的(大​​部分有效的)代码旨在删除 HttpOnly:

##############################
# Make my-cookie not HttpOnly #
##############################

##### Handle Set-Cookie on response #####

## Is my-cookie on the response?
acl is_mycookie_cookie_set_res res.cook(my-cookie) -m found

## If yes, set a var with that value
http-response set-var(txn.mycookie_value_res) res.cook(my-cookie) if is_mycookie_cookie_set_res

## And replace if HttpOnly found
http-response replace-header Set-Cookie "^my-cookie=(.*?);(.*?(?:HttpOnly)).*" "my-cookie=%[var(txn.mycookie_value_res)]; expires=Tue, 04-Feb-2070 23:59:59 GMT; path=/; samesite=lax" if is_mycookie_cookie_set_res

##### END Handle Set-Cookie on response #####

##### Handle Cookie on request #####

## Is my-cookie on the request?
## If yes, set a var with that value
http-request set-var(txn.mycookie_value_req) req.cook(my-cookie)
acl mycookie_cook_set_req var(txn.mycookie_value_req) -m found

## And set that cookie if none defined by the backend
http-response add-header Set-Cookie "my-cookie=%[var(txn.mycookie_value_req)]; expires=Tue, 04-Feb-2070 23:59:59 GMT; path=/; samesite=lax" if mycookie_cook_set_req !is_mycookie_cookie_set_res

##### END Handle Cookie on request #####

##################################
# End Make my-cookie not HttpOnly #
##################################

部分新代码尝试将 cookie 设置为顶级域:

# regsub() here wont deal with all the different TLDs :-(
http-request set-var(txn.my_host) req.hdr(host),lower,word(1,:).regsub("^[a-z0-9_-]+\.",".",g)
http-response add-header Set-Cookie "my-cookie-name=%[var(txn.mycookie_value_req)]; expires=Wed, 05-Feb-2070 23:59:54 GMT; path=/; domain=.%[var(txn.my_host)]; samesite=lax; Secure" if mycookie_cook_set_req !is_mycookie_cookie_set_res

我如何让 HAProxy 为我创建一个仅包含顶级域的变量?

相关内容