我正在运行 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 为我创建一个仅包含顶级域的变量?