我正在使用HAProxy进行负载平衡,只希望我的网站支持https。因此,我想将端口80上的所有请求重定向到端口443。
我该怎么做?
编辑:我们想重定向到https上的相同URL,保留查询参数。因此,http://foo.com/bar将重定向到https://foo.com/bar
我正在使用HAProxy进行负载平衡,只希望我的网站支持https。因此,我想将端口80上的所有请求重定向到端口443。
我该怎么做?
编辑:我们想重定向到https上的相同URL,保留查询参数。因此,http://foo.com/bar将重定向到https://foo.com/bar
Answers:
http-request redirect scheme https code 301 if !{ ssl_fc }
。ALOHA HAProxy 7.0中的HTTP重定向文档甚至提到“ 两个指令的语法相同,也就是说,现在将重定向视为旧版,并且配置应移至http-request重定向形式 ”。我不确定地推断,相同的解释适用于开源版本的HAProxy的较新版本。
我没有足够的声誉来评论以前的答案,所以我发布了一个新的答案来补充Jay Taylor的答案。基本上,他的答案将执行重定向,尽管是隐式重定向,这意味着它将发出302(临时重定向),但是由于问题告知整个网站将作为https进行服务,因此适当的重定向应为301(永久重定向) )。
redirect scheme https code 301 if !{ ssl_fc }
这似乎是一个很小的变化,但是根据网站的不同,其影响可能会很大,使用永久重定向,我们会通知浏览器,从一开始就不再寻找http版本(避免以后的重定向),这是https的省时方法网站。它也有助于SEO,但不能使您的链接更加混乱。
要重定向所有流量:
redirect scheme https if !{ ssl_fc }
重定向单个URL(如果有多个前端/后端)
redirect scheme https if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
根据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
user2966600的解决方案略有不同...
要重定向除单个URL 以外的所有URL(如果有多个前端/后端):
redirect scheme https if !{ hdr(Host) -i www.mydomain.com } !{ ssl_fc }
就像杰伊·泰勒(Jay Taylor)所说的那样,HAProxy 1.5-dev具有redirect scheme
配置指令,可以完全满足您的需求。
但是,如果您无法使用1.5,并且打算从源代码编译HAProxy,则我会向后移植此redirect scheme
功能,使其在1.4中可用。您可以在此处获取补丁:http : //marc.info/?l=haproxy&m=138456233430692&w=2
如果要重写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
希望对您有帮助
为什么不使用ACL来区分流量?在我的头上:
acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver
这是在马修·布朗回答的内容之上。
请参阅ha docs,搜索hdr_dom等内容,以查找更多ACL选项。有很多选择。
redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }