基于这个答案,我可以使用查询参数成功覆盖后端:
backend servers
balance roundrobin
cookie SERVERID insert indirect nocache
use-server web1 if { urlp(SERVERID) -i web1 }
use-server web2 if { urlp(SERVERID) -i web2 }
server web1 web1-internal:80 check cookie web1
server web2 web2-internal:80 check cookie web2
但是,我希望这在后续请求中“持续存在”;即,我希望使用查询参数中的值的新 Set-Cookie 覆盖任何现有的 SERVERID cookie。如果请求带有有效的 SERVERID Cookie,则 HAProxy 不会添加 Set-Cookie。删除该indirect
选项不起作用。
唯一的解决方案是使用preserve
并让后端始终使用 Set-Cookie 进行响应,还是有办法在 HAProxy 中执行此操作?
答案1
我通过创建设置 SERVERID cookie 的新后端并通过前端指令路由到它们来实现这一点。
frontend http_in
acl set_current_site_cookie urlp(current_site) true
acl set_snapshot_site_cookie urlp(snapshot_site) true
bind *:80
use_backend set_current_site_cookie if set_current_site_cookie
use_backend set_snapshot_site_cookie if set_snapshot_site_cookie
default_backend servers
backend set_current_site_cookie
cookie SERVERID insert
server current_site server.com:80 cookie current_site
backend set_snapshot_site_cookie
cookie SERVERID insert
server snapshot_site snapshot-server:80 cookie snapshot_site
backend servers
cookie SERVERID insert indirect nocache
server current_site server.com:80 cookie current_site weight 50
server snapshot_site snapshot-server:80 cookie snapshot_site weight 50
我们将其用于分阶段推出,将后端的权重设置servers
为 0,然后使用查询参数进行测试current_site=true
。