HAProxy将HTTP重定向到https(ssl)


99

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

我该怎么做?

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

Answers:


137

我发现这是最大的帮助

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

redirect scheme https code 301 if !{ ssl_fc }

20
为此,请从下面User2966600的答案中添加301,使用它仅重定向到特定域的https:redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Quentin Skousen 2015年

1
那行得通。尽管没有“代码301”无法正常工作。感谢更新。
deej 2016年

6
给定答案的等效语法如下:http-request redirect scheme https code 301 if !{ ssl_fc }ALOHA HAProxy 7.0中的HTTP重定向文档甚至提到“ 两个指令的语法相同,也就是说,现在将重定向视为旧版,并且配置应移至http-request重定向形式 ”。我不确定地推断,相同的解释适用于开源版本的HAProxy的较新版本。
rodolfojcj

感谢您的回复。您能否解释一下我们必须在何处添加此行?在前端/后端/默认/全局/ ..
realtebo

我通常将其放置在前端中,但重定向只是一个标头,因此我希望可以触发重定向,直到发送响应标头为止。我想知道它是否可以在两个地方都可以使用,请尝试一下。
杰伊·泰勒

68

我没有足够的声誉来评论以前的答案,所以我发布了一个新的答案来补充Jay Taylor的答案。基本上,他的答案将执行重定向,尽管是隐式重定向,这意味着它将发出302(临时重定向),但是由于问题告知整个网站将作为https进行服务,因此适当的重定向应为301(永久重定向) )。

redirect scheme https code 301 if !{ ssl_fc }

这似乎是一个很小的变化,但是根据网站的不同,其影响可能会很大,使用永久重定向,我们会通知浏览器,从一开始就不再寻找http版本(避免以后的重定向),这是https的省时方法网站。它也有助于SEO,但不能使您的链接更加混乱。


40

要重定向所有流量:

redirect scheme https if !{ ssl_fc }

重定向单个URL(如果有多个前端/后端)

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


1
谢谢,“仅在特定主机上”的条件正是我想要的!
Quentin Skousen 2015年

16

根据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

7
这样就可以将所有内容重定向到foo.bar.com。不过,理想情况下,我们希望foo.bar.com/baz重定向到foo.bar.com/baz。我们还需要查询参数。
乔恩·朱

@JonChu提出了一个有效的用例,这只是部分解决方案。
杰伊·泰勒

3
而不是使用重定向位置,请尝试使用重定向前缀https://foo.bar.com。Jon Chu提到的用例应该有所帮助。
xangxiong

16

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

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

这使用'code 301'有点儿幻想,但也可能会让客户知道它是永久的。对于默认配置,“模式http”部分不是必不可少的,但不会造成任何伤害。如果您有mode tcp默认值部分(就像我一样),则很有必要。


10

user2966600的解决方案略有不同...

要重定向单个URL 以外的所有URL(如果有多个前端/后端):

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

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


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

1

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

http-request redirect scheme https if !{ ssl_fc }

将HTTP流量重定向到https。


0

如果要重写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上的所有请求重定向到代理后面的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

希望对您有帮助


0

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

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

这是在马修·布朗回答的内容之上。

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



0

可以这样做-

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

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


0

重定向语句是遗留的

使用http请求重定向代替

acl http      ssl_fc,not
http-request redirect scheme https if http
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.