我需要在同一域上部署不同的应用程序,因此,我设置了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
答案 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或更高版本。