HAProxy将http重定向到https(ssl)

时间:2012-11-05 07:10:17

标签: http redirect ssl https haproxy

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

我该怎么做?

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

15 个答案:

答案 0 :(得分:121)

I found this to be the biggest help

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

redirect scheme https code 301 if !{ ssl_fc }

答案 1 :(得分:61)

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

redirect scheme https code 301 if !{ ssl_fc }

这似乎是一个很小的变化,但影响可能很大,具体取决于网站,我们通知浏览器它应该不再从头开始寻找http版本(避免将来的重定向) - 永久重定向 - 一次https网站的保护程序。它也有助于搜索引擎优化,但不会划分你的链接。

答案 2 :(得分:37)

重定向所有流量:

redirect scheme https if !{ ssl_fc }

重定向单个网址(如果是多个前端/后端)

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

答案 3 :(得分:14)

根据http://parsnips.net/haproxy-http-to-https-redirect/,它应该像配置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

答案 4 :(得分:11)

将http到https的所有内容重定向的最佳保证方式是:

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

这是一个使用'代码301'的小爱好者,但也许让客户知道它是永久性的。 'mode http'部分对于默认配置不是必需的,但不能伤害。如果您在默认部分中有mode tcp(就像我一样),那么这是必要的。

答案 5 :(得分:9)

用户2966600的解决方案稍有不同......

重定向所有一个网址(如果有多个前端/后端):

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

答案 6 :(得分:4)

就像Jay Taylor所说,HAProxy 1.5-dev具有redirect scheme配置指令,可以完全满足您的需求。

但是,如果您无法使用1.5,并且如果您要从源代码编译HAProxy,我会向后移植redirect scheme功能,以便它在1.4中工作。您可以在此处获取补丁:http://marc.info/?l=haproxy&m=138456233430692&w=2

答案 7 :(得分:2)

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

答案 8 :(得分:0)

如果要重写网址,则必须更改网站虚拟主机添加以下行:

### Enabling mod_rewrite
Options FollowSymLinks
RewriteEngine on

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

但是,如果您想将端口80上的所有请求重定向到代理后面的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

我希望这可以帮到你

答案 9 :(得分:0)

为什么不使用ACL来区分流量?在我的头顶:

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

这是Matthew Brown回答的问题。

请参阅ha docs,搜索hdr_dom及以下内容以查找更多ACL选项。有很多选择。

答案 10 :(得分:0)

将其添加到HAProxy前端配置中:

acl http      ssl_fc,not
http-request redirect scheme https if http
  

HAProxy - Redirecting HTTP Requests

答案 11 :(得分:0)

在较新版本的HAProxy中,建议使用

http-request redirect scheme https if !{ ssl_fc }

将http流量重定向到https。

答案 12 :(得分:0)

可以这样-

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

任何点击http的流量都会重定向到https

答案 13 :(得分:0)

简单地:

frontend incoming_requsts
        bind *:80
        bind *:443 ssl crt *path_to_cert*.**pem**
        **http-request redirect scheme https unless { ssl_fc }**
        default_backend k8s_nodes

答案 14 :(得分:0)

  acl host-example hdr(host) -i www.example.com

  # for everything not https
  http-request redirect scheme https code 301 unless { ssl_fc }

  # for anything matching acl
  http-request redirect scheme https code 301 if host-example !{ ssl_fc }