Haproxy 的重定向跳轉設置 - 運維小結
前面已經詳細介紹了Haproxy基礎知識 , 今天這裏再贅述下Haproxy的重定向跳轉的設置. haproxy利用acl來實現haproxy動靜分離,然而在許多運維應用環境中,可能需要將訪問的站點請求跳轉到指定的站點上,比如客戶單端訪問kevin.a.com需要將請求轉發到bobo.b.com或將http請求重定向到https請求,再比如當客戶端訪問出錯時,需要將錯誤code代碼提示請求到指定的錯誤頁面,諸如此類需求實現,這種情況下就需要利用haproxy的重定向功能來達到此目的。
一. Haproxy實現request請求重定向
關於Hproxy 請求重定向主要會用到: redirect
1) redirect重定向的用法: (redirect通常配置在haproxy acl部分)
redirect一般有兩個指令來執行HTTP重定向:
http-requets redirect #此種方式支持日誌變量格式
redirect #此種方式只依賴於靜態字符串
這兩個指令的語法是相同的,即redirect現在被認為是傳統和配置應該移動到http-request redirect形式。
還有一個主要區別是:http-request redirect使用日誌可變格式, 而redirect語句只依賴於靜態字符串。
2) redirect有三種重定向方式
a) 位置重定向
使用語法如下:
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重定向的狀態代碼來執行。 此選項下的允許的狀態碼如下所示:
* <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的名稱
b) 前綴重定向
使用語法如下:
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重定向的狀態代碼來執行。 此選項下的允許的狀態碼如下所示:
* <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的名稱
c) 協議(計劃)重定向(比如將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重定向的狀態代碼來執行。 此選項下的允許的狀態碼如下所示:
* <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://kevin.com set-cookie SEEN=1 if !cookie_set redirect prefix https://kevin.com if login_page !secure redirect prefix http://kevin.com drop-query if login_page !uid_given redirect location http://kevin.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.kevin.com
上面配置含義:所有發往localhost:81的請求做重定向,重定向到www.kevin.com因此可以實現單臺服務器的重定向
又例如,如果我們要講訪問的站點重定向到grace.com
frontend main *:80 default_backend app backend app balance roundrobin server node1 127.0.0.1:81 check weight 3 redir http://www.grace.com
註意: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頁面重定向到其他頁面的話 (errorloc),則參考以下配置:
frontend web_server bind *:80 default_backend webserver acl badguy src 172.16.50.10 block if badguy errorloc 403 http://grace.com/ #定義錯誤頁面重定向
errorfile 表示在用戶請求不存在的頁面時,返回一個頁面給客戶端而非有haproxy生成的錯誤代碼,可用於所有段中;
格式: errorfile <code> <file>
errorloc 表示請求錯誤時,返回一個HTTP重定向至某URL的信息,可以用於所有端中;
格式: errorloc <code> <url>
總結: 錯誤重定向可以更加友好地提示客戶端錯誤狀態,比如做定制頁面化跳轉,以及網站維護升級等等,當出現錯誤時,可以及時跳轉到預定好錯誤提示頁面上。
Haproxy 的重定向跳轉設置 - 運維小結