首页 > 解决方案 > 如何使 HAProxy 的 SSL 重定向和路径重写(使用 reqrep)同时工作?

问题描述

我需要在同一个域上部署不同的应用程序,因此我设置了backendreqrep ^([^\ ]*\ /)appA[/]?(.*) \1\2. 当我只部署应用程序的 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

标签: sslredirectproxyreverse-proxyhaproxy

解决方案


使用http-request以声明顺序处理的指令。它们也是较新的功能,通常比reqxxx.

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

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


推荐阅读