如何使 HAProxy 的 SSL 重定向和路径重写(使用 reqrep)同时工作?
How to make HAProxy's SSL redirect and path rewrite (with reqrep) work at the same time?
我需要在同一个域上部署不同的应用程序,因此我设置了 backend
以用 reqrep ^([^\ ]*\ /)appA[/]?(.*)
重写 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[/]?(.*)
redirect scheme https if !{ ssl_fc }
balance roundrobin
server web1 127.0.0.1:5001 check
使用http-request
指令,这些指令按声明顺序处理。它们也是较新的功能,通常比 reqxxx
.
更简洁、更直观、更灵活且内部效率更高
http-request redirect scheme https if ! { ssl_fc }
http-request set-path %[path,regsub(^/appA/,/)]
参见http-request
。需要 1.6 或更高版本,其中 regsub()
转换器可用。
我需要在同一个域上部署不同的应用程序,因此我设置了 backend
以用 reqrep ^([^\ ]*\ /)appA[/]?(.*)
重写 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[/]?(.*)
redirect scheme https if !{ ssl_fc }
balance roundrobin
server web1 127.0.0.1:5001 check
使用http-request
指令,这些指令按声明顺序处理。它们也是较新的功能,通常比 reqxxx
.
http-request redirect scheme https if ! { ssl_fc }
http-request set-path %[path,regsub(^/appA/,/)]
参见http-request
。需要 1.6 或更高版本,其中 regsub()
转换器可用。