【问题标题】:How to make HAProxy's SSL redirect and path rewrite (with reqrep) work at the same time?如何使 HAProxy 的 SSL 重定向和路径重写(使用 reqrep)同时工作?
【发布时间】:2018-06-30 14:54:41
【问题描述】:

我需要在同一个域上部署不同的应用程序,因此我设置了backend 以使用reqrep ^([^\ ]*\ /)appA[/]?(.*) \1\2 重写 URL。当我只部署应用程序的 HTTP 或 HTTPS 版本时,它可以工作。

但是,如果我尝试将所有 HTTP 流量重定向到 HTTPS,它就不起作用。问题是 HAProxy 在重定向之前已经重写了 URL 并删除了 /appA 部分。因此,如果我尝试访问http://myserver.com/appA,最终将请求页面https://myserver.com,而不是https://myserver.com/appA

我不能将重定向规则放在 reqrep 规则之前,因为 HAProxy 似乎必须在重定向之前处理所有重写。

我可以做些什么来使我的配置按预期工作?这应该很明显,但我似乎无法在网上找到相关答案。

我的配置:

frontend http_front
  bind *:80
  reqadd X-Forwarded-Proto:\ http
  acl appA_url url_beg /appA
  use_backend appA if appA_url

frontend https_front
  bind *:443 ssl crt /etc/haproxy/certs/myserver.com.pem
  reqadd X-Forwarded-Proto:\ https
  acl appA_url url_beg /appA
  use_backend appA if appA_url

backend appA
  reqrep ^([^\ ]*\ /)appA[/]?(.*)     \1\2
  redirect scheme https if !{ ssl_fc }
  balance roundrobin
  server web1 127.0.0.1:5001 check

【问题讨论】:

    标签: ssl redirect proxy reverse-proxy haproxy


    【解决方案1】:

    使用http-request 指令,这些指令按声明顺序处理。它们也是较新的功能,通常比reqxxx 更简洁、更直观、更灵活且内部效率更高。

    http-request redirect scheme https if ! { ssl_fc }
    http-request set-path %[path,regsub(^/appA/,/)]
    

    http-request。需要 1.6 或更高版本,其中regsub() 转换器可用。

    【讨论】:

    • 谢谢。我看了haproxy.com/documentation/aloha/9-5/traffic-management/… 虽然我没有意识到regsub 的用途。此外,它应该是regsub(^/appA,/),即路径中没有第二个斜杠。
    • 你是对的,我的解决方案不能处理没有斜杠的裸值,但小时也不会完全正确,因为这样/appA/foo 就变成了//foo
    • 最正确的解决方案实际上是重定向确切的路径 /appA 以附加斜线使其成为 /appA/,否则,所有相对路径都是一对一的,因为 @987654334 @ + ./foo 被解析为/foo/appA/ + ./foo 被解析为/appA/foo。当后端不知道浏览器理解的实际路径时,路径可能会变得有点微妙。
    • *你的,不是“小时”
    • 这是有道理的。目前双斜杠似乎并没有破坏我的应用程序,但我知道不应该依赖这种行为。更改后端路由规则,以便 /appA/ 前缀到每个路由,而不是尝试使用 HAProxy 重写来创建浏览器和后端之间的差异,那么在这种情况下似乎是一种解决方案。
    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2012-12-10
    • 2013-11-07
    • 2014-09-07
    相关资源
    最近更新 更多