HAProxyredirecthttp到https(ssl)

我正在使用HAProxy进行负载平衡,只希望我的网站支持https。 因此,我想将端口80上的所有请求redirect到端口443。

我将如何做到这一点?

编辑:我们想在https上redirect到相同的url,保留查询参数。 因此, http://foo.com/bar会redirect到https://foo.com/bar

我发现这是最大的帮助 :

使用HAProxy 1.5-dev13或更新版本,只需将以下行添加到前端configuration:

redirect scheme https code 301 if !{ ssl_fc } 

我没有足够的声望评论以前的答案,所以我发布了一个新的答案来补充Jay Taylor的答案。 基本上他的答案会做redirect,虽然隐式redirect,这意味着它会发出一个302(临时redirect),但由于问题通知,整个网站将作为HTTPS,那么适当的redirect应该是一个301(永久redirect)。

 redirect scheme https code 301 if !{ ssl_fc } 

这似乎是一个小小的变化,但影响可能是巨大的,取决于网站,永久redirect,我们通知浏览器,它不应该再从一开始就寻找HTTP版本(避免未来redirect) – 一个节省时间的HTTPS站点。 它也有助于search引擎优化,但不能分割您的链接果汁。

redirect所有stream量:

redirect scheme https if !{ ssl_fc }

redirect一个URL(在多个前端/后端的情况下)

redirect scheme https if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }

根据http://parsnips.net/haproxy-http-to-https-redirect/它应该像configuration你的haproxy.cfg包含以下一样简单。;

 #--------------------------------------------------------------------- # Redirect to secured #--------------------------------------------------------------------- frontend unsecured *:80 redirect location https://foo.bar.com #--------------------------------------------------------------------- # frontend secured #--------------------------------------------------------------------- frontend secured *:443 mode tcp default_backend app #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend app mode tcp balance roundrobin server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check 

user2966600解决scheme的细微变化…

redirect一个URL 之外的所有内容(在多个前端/后端的情况下):

 redirect scheme https if !{ hdr(Host) -i www.mydomain.com } !{ ssl_fc } 

就像Jay Taylor所说的那样,HAProxy 1.5-dev具有redirect schemeconfiguration指令,它完全实现了你所需要的。

但是,如果你不能使用1.5,而且如果你想从源代码编译HAProxy的话,我会支持redirect schemefunction,所以它在1.4中工作。 你可以在这里得到补丁: http : //marc.info/?l=haproxy&m=138456233430692&w=2

 frontend unsecured *:80 mode http redirect location https://foo.bar.com 

将所有httpredirect到https的最好方法是:

 frontend http-in bind *:80 mode http redirect scheme https code 301 

这是一个使用“代码301”的小爱好者,但不妨让客户知道它是永久性的。 “模式http”部分对于默认configuration不是必需的,但是不能伤害。 如果你有默认值mode tcp (像我这样做),那么这是必要的。

如果你想重写url,你必须改变你的网站虚拟主机添加以下几行:

 ### Enabling mod_rewrite Options FollowSymLinks RewriteEngine on ### Rewrite http:// => https:// RewriteCond %{SERVER_PORT} 80$ RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,NC,L] 

但是,如果您希望将端口80上的所有请求redirect到代理服务器后面的Web服务器的端口443,则可以在haproxy.cfg中尝试以下示例 conf:

 ########## # Global # ########## global maxconn 100 spread-checks 50 daemon nbproc 4 ############ # Defaults # ############ defaults maxconn 100 log global mode http option dontlognull retries 3 contimeout 60000 clitimeout 60000 srvtimeout 60000 ##################### # Frontend: HTTP-IN # ##################### frontend http-in bind *:80 option logasap option httplog option httpclose log global default_backend sslwebserver ######################### # Backend: SSLWEBSERVER # ######################### backend sslwebserver option httplog option forwardfor option abortonclose log global balance roundrobin # Server List server sslws01 webserver01:443 check server sslws02 webserver02:443 check server sslws03 webserver03:443 check 

我希望这可以帮助你

你为什么不使用ACL来区分stream量? 在我头顶上:

 acl go_sslwebserver path bar use_backend sslwebserver if go_sslwebserver 

这是马修·布朗所回答的。

查看ha文档 ,search诸如hdr_dom之类的东西,find更多的ACL选项。 有很多select。