我根据 acl 条件重定向到某个域,但我希望用户最终根据其请求的方案/协议重定向到 或http
。https
我已设法使用下面显示的 2 行代码做到这一点,但我想将它们转换为 1 行代码:
http-request redirect code 301 location http://www.example.com%[url] if acl_whatever !{ ssl_fc }
http-request redirect code 301 location https://www.example.com%[url] if acl_whatever { ssl_fc }
理想情况下,我想重定向到类似%[scheme]://www.example.com%[url]
但%[scheme]
不存在的东西。
是否有一个变量或函数可以返回http
,https
这样我就不必重复规则两次了?也许可以通过某种方式设置一个包含方案的变量,或者使用值为%[ssl_fc]
0 或 1 的变量?
答案1
您可以使用http-request set-var
和 来做到这一点%[var(name)]
:
http-request set-var(req.scheme) str(https) if { ssl_fc }
http-request set-var(req.scheme) str(http) if ! { ssl_fc }
http-request redirect code 301 location %[var(req.scheme)]://www.example.com%[url] if acl_whatever
答案2
另外:
如果响应中需要请求模式,则txn
必须使用范围而不是req
。
例如:
frontend http_awesome_frontend
http-request set-var(txn.scheme) str(https) if { ssl_fc }
http-request set-var(txn.scheme) str(http) if !{ ssl_fc }
# Outer frontend response:
http-response add-header X-Original-Proto %[var(txn.scheme)]
所有变量都是有作用域的,也就是说,它们只能在相同或更大的范围内访问。设置变量时,可以在其名称前加上作用域。作用域可以是以下任意一种:
- 进程:变量在所有阶段都可用
- 塞斯:变量在客户端的整个 TCP 会话期间可用
- 陣陣:变量在整个 HTTP 请求-响应事务期间可用
- 要求:变量仅在 HTTP 请求阶段可用
- 水库:变量仅在 HTTP 响应阶段可用
资料来源:HA 代理文档