如何根据请求的方案进行重定向(http 或 https)

如何根据请求的方案进行重定向(http 或 https)

我根据 acl 条件重定向到某个域,但我希望用户最终根据其请求的方案/协议重定向到 或httphttps我已设法使用下面显示的 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]不存在的东西。

是否有一个变量或函数可以返回httphttps这样我就不必重复规则两次了?也许可以通过某种方式设置一个包含方案的变量,或者使用值为%[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 代理文档

相关内容