HAproxy指南之haproxy重定向应用(案例篇)

面我们讲到了haproxy利用acl来实现haproxy动静分离,在许多应用环境中,可能需要将访问的站点请求跳转到指定的站点上,比如客户单端访问xx.a.com需要将请求转发到xx.b.com或将http请求重定向到https请求,又例如当客户端访问出错,我们需要将错误code代码提示请求到指定的错误页面,诸如此类需求实现,就需要利用haproxy的重定向功能来达到此目的。


一. haproxy实现request请求重定向

关于haproxy 请求重定向主要会用到:1. redirect ;2. redir 这两类重定向配置语法。  

1. redirect重定向的用法:(redirect通常配置在haproxy acl部分)

redirect一般有两个指令来执行HTTP重定向:

http-requets redirect     (此种方式支持日志变量格式)、

redirect                          (此种方式只依赖于静态字符串)

这两个指令的语法是相同的,即redirect现在被认为是传统和配置应该移动到http-request redirect形式。

一个其它的主要区别是:http-request redirect使用日志可变格式redirect语句只依赖于静态字符串

redirect有三种重定向方式:

(1)位置重定向

使用语法如下:

redirect location <loc> [code <code>] <option> [{if | unless} <condition>]

使用位置重定向,例如下面所示指令可以将用户重定向到所提供的精确位置, 该位置可以是第三方URL链接,也可以是本地web服务的另一个访问路径

1. http-request redirect location <loc> [code <code>] [<option>] [<condition>]

2. redirect location <loc> [code <code>] [<option>] [<condition>]

相关指令参数如下:

* <loc> :一个日志格式变量 (或简单的字符串redirect语句)描述了新位置;

* code <code>(可选):HTTP重定向的状态代码来执行。 此选项下的允许的状态码如下所示:

状态码含义
301永久移动,转发
302临时移动,不应该由客户端进行缓存。 这是默认值,如果没有code配置。
303像302,但是浏览器必须使用GET获取新位置
307像302,但浏览器必须重新使用相同的方法之一,从原来的请求
308像301,但浏览器必须重新使用相同的方法比从原始请求所述一个

* <option>(可选): 可以是以下任何或组合的声明:

1. set-cookie NAME[=value] :一个Set-Cookie头部被添加到重定向。该cookie被命名为名称,可以有一个可选的值值。

2.  clear-cookie NAME[=]一个特殊的Set-Cookie头被添加到重定向。该Cookie名为名称和最大年龄的cookie参数设置为0,目的是为了指示浏览器删除cookie。

注意:在于浏览器中,这是两个不同的Cookie:NAME和NAME = 以上根据您的流量模式,必须将两个语句适应。

* if | unless :用于条件判断

* <condition> (可选):用于匹配acl,一般为acl的名称


(2)前缀重定向

使用语法如下:

redirect prefix <loc> [code <code>] <option> [{if | unless} <condition>]

使用前缀重定向,将用户重定向到由concateneting建立了一个网址<pfx>和完整的原始URI路径:

1. http-request redirect prefix <pfx> [code <code>] [<option>] [<condition>]

2. redirect prefix <pfx> [code <code>] [<option>] [<condition>]

相关指令参数如下:

* <pfx>一个日志格式变量 (或简单的字符串redirect语句)描述了新的位置前缀。

* code <code>(可选):HTTP重定向的状态代码来执行。 此选项下的允许的状态码如下所示:

状态码含义
301永久移动,转发
302临时移动,不应该由客户端进行缓存。 这是默认值,如果没有code配置。
303像302,但是浏览器必须使用GET获取新位置
307像302,但浏览器必须重新使用相同的方法之一,从原来的请求
308像301,但浏览器必须重新使用相同的方法比从原始请求所述一个

<option>(可选): 可以是以下任何或组合的声明:

drop-query :在执行串联时从原来的URL删除查询字符串

append-slash :配合使用drop-query ,在该URL的末尾添加一个“/”字符

set-cookie NAME[=value] :一个Set-Cookie头部被添加到重定向。该cookie被命名为名称,可以有一个可选的值值。

clear-cookie NAME[=] :一个特殊的Set-Cookie头被添加到重定向。该Cookie名为名称和最大年龄的cookie参数设置为0,目的是为了指示浏览器删除cookie。


* if | unless :用于条件判断

* <condition> (可选):用于匹配acl,一般为acl的名称


(3)协议(计划)重定向(比如将http重定向到https)

使用语法如下:

redirect scheme <sch> [code <code>] <option> [{if | unless} <condition>]

使用位置重定向,例如下面所示指令可以将用户重定向到所提供的新的http协议url链接, 一般用于非安全链接跳转到安全链接,比如http跳转到https上

1. http-request redirect scheme <schloc> [code <code>] [<option>] [<condition>]

2. redirect scheme <sch> [code <code>] [<option>] [<condition>]

相关指令参数如下:

* <loc> :一个日志格式变量 (或简单的字符串redirect语句)描述了新位置;

* code <code>(可选):HTTP重定向的状态代码来执行。 此选项下的允许的状态码如下所示:

状态码含义
301永久移动,转发
302临时移动,不应该由客户端进行缓存。 这是默认值,如果没有code配置。
303像302,但是浏览器必须使用GET获取新位置
307像302,但浏览器必须重新使用相同的方法之一,从原来的请求
308像301,但浏览器必须重新使用相同的方法比从原始请求所述一个

<option>(可选): 可以是以下任何或组合的声明:

1. set-cookie NAME[=value] :一个Set-Cookie头部被添加到重定向。该cookie被命名为名称,可以有一个可选的值值。

2.  clear-cookie NAME[=]一个特殊的Set-Cookie头被添加到重定向。该Cookie名为名称和最大年龄的cookie参数设置为0,目的是为了指示浏览器删除cookie。

注意:在于浏览器中,这是两个不同的Cookie:NAME和NAME = 以上根据您的流量模式,必须将两个语句适应。

* if | unless :用于条件判断

* <condition> (可选):用于匹配acl,一般为acl的名称

如下为一个简单的实例:

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

以下为redirect 综合应用的案例,如下:

acl clear      dst_port  80
acl secure     dst_port  8080
acl login_page url_beg   /login
acl logout     url_beg   /logout
acl uid_given  url_reg   /login?userid=[^&]+
acl cookie_set hdr_sub(cookie) SEEN=1 

redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set
redirect prefix   https://mysite.com           if login_page !secure
redirect prefix   http://mysite.com drop-query if login_page !uid_given
redirect location http://mysite.com/           if !login_page secure
redirect location / clear-cookie USERID=       if logout

总结:

redirect三种重定向可以混合使用,比较常用的有redirect prefix 和 redirect location这两种方式,从某种理解上可以交差使用;


2. redir重定向的用法:(redir通常配置在haproxy backend部分)

使用redir 会将发往backend的站点服务请求均以302状态响应发给需要重定向的server服务或站点,此时haproxy不需要向后端web server提交请求;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以避免造成循环,例如:

frontend  main *:80
    default_backend             app
backend app
    balance     roundrobin
    server node1 127.0.0.1:81 check weight 3 redir http://www.bluemobi.cn

上面配置含义:所有发往localhost:81的请求做重定向,重定向到www.bluemobi.cn因此可以实现单台服务器的重定向

又例如,如果我们要讲访问的站点重定向到baidu.com

frontend  main *:80
    default_backend             app
backend app
    balance     roundrobin
    server node1 127.0.0.1:81 check weight 3 redir http://www.baidu.cn

注意:redir只做跳转,如客户端输入:http://ip ,将会跳转到指定的页面上,此时客户端的页面的页面也会跳转到指定的页面上,之后所有的请求都会递交到该站点(前提该站点可以与客户端通讯),而不再发往haproxy代理站点,haproxy也不需要往后端web server提交客户端发过来的请求。


二. haproxy实现error重定向

格式为: errorfile  错误代码code  错误代码响应提示页路径

* errorfile 即根据客户端页面错误code状态将指定的错误状态页面提示给客户端,比如友情提示页面,一般如下:

errorfile 403 /etc/haproxy/errorfiles/403.http
errorfile 500 /etc/haproxy/errorfiles/500.http
errorfile 502 /etc/haproxy/errorfiles/502.http
errorfile 503 /etc/haproxy/errorfiles/503.http
errorfile 504 /etc/haproxy/errorfiles/504.http

例如:如果想访问403页面重定向到其他页面的话,则参考以下配置

frontend web_server
    bind *:80
    default_backend webserver
    acl badguy src 10.0.10.1
    block if badguy
    errorloc 403 http://baidu.com/     #定义错误页面重定向

总结: 错误重定向可以更加友好地提示客户端错误状态,比如做定制页面化跳转,以及网站维护升级等等,当出现错误时,可以及时跳转到预定好错误提示页面上。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值