如何使HAProxy的SSL重定向和路径重写(使用reqrep)同时工作?

时间:2018-06-30 14:54:41

标签: ssl redirect proxy reverse-proxy haproxy

我需要在同一域上部署不同的应用程序,因此,我设置了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

1 个答案:

答案 0 :(得分:1)

使用http-request指令,该指令以声明顺序进行处理。它们也是较新的功能,通常比reqxxx更干净,更直观,更灵活并且内部效率更高。

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

请参见http-request。需要regsub()转换器可用的1.6或更高版本。