1. 程式人生 > >使用ATS中的regex_remap外掛實現正則匹配的url重定向

使用ATS中的regex_remap外掛實現正則匹配的url重定向

要點總結如下:
1.正向和反向代理可以同時並存,並且remap可以相容這兩種模式。
2.在使用regex_map時,是藉助remap的配置來設定,而且remap.so和regex_remap.so已經事先安裝進系統了,啟用remap或是regex_remap功能只需要搞好配置就可以了。
3.使用瀏覽器時,反向代理在位址列中輸入ATS的ip地址,正向代理時需要事先設定瀏覽器使用代理上網,但是位址列的地址不變

一、反向代理模式

remap是ATS做URL rewrite的方式,也是ATS在配置檔案設計方面的特殊部分。從功能上來講,ATS的remap更像一個精簡版本的Apache Httpd的rewrite模組。remap之所以重要,是因為它定義了一個很方便的API入口,我們可以通過remap系統,編寫remap外掛。

remap.config定義對映規則,用於請求的重寫(rewrite),反向代理即在此配置。
在remap.config中做如下配置
map http://d1.sina.com.cn http://192.168.90.26 @plugin=regex_remap.so @pparam=maps.reg @pparam=profile @pparam=method

@profile是將列印資訊輸入/usr/local/var/log/trafficserver/traffic.out
@method是匹配http方法

動態庫的預設存放路徑/usr/local/libexec/trafficserver/regex_remap.so
注意在預設安裝ATS時,它已經被安裝到指定的路徑下面了,你可以使用下面的命令驗證
locate regex_remap.so
是否可以找到該so檔案

config file的預設存放路徑是/usr/local/etc/regex_remap/maps.reg(需要事先手動建立),它裡面存放著我們設定的匹配規則,內容如下
^/pfpghc/(.*).swf$  http://www.baidu.com/image/in_011.png
@status=302

下面是搭建反向代理的方法
在預設的ATS配置的基礎上,關閉host header透傳,修改如下配置項為
CONFIG proxy.config.url_remap.pristine_host_hdr INT 1 改成0

然後在remap.config中做如下配置:
map http://10.10.110.31:8080/ http://news.sina.com.cn/
reverse_map http://news.sina.com.cn/ http://10.10.110.31:8080/

這裡map的第一個http表示是User-Agent去訪問網頁的請求url,第二個http表示ATS去獲取源的url,整行的意思是,將dns的ip解析為新浪新聞主頁;

這裡reverse_map的這一行表示將新浪新聞源站返回的域名轉成ip再響應給代理使用者


對一個正常的如下網址:
http://news.sina.com.cn/s/2014-01-26/150729350128.shtml
使用下面的方式之一訪問反向代理伺服器
http://10.10.110.39:8080/s/2014-01-26/150729350128.shtml(公司)
http://192.168.0.106:8080/s/2014-01-26/150729350128.shtml(家裡)

使用下面的方法來使重定向生效。
使用下面的方法使remap.config中的配置值生效,避免重啟機器
 $ sudo touch /usr/local/etc/trafficserver/remap.config(如果沒有變動,再更新一下檔案建立時間,如果剛修改檔案,不用命令)

 $ sudo traffic_line -x(這個命令使所有的配置檔案重新載入,當修改了叢集中的某一個節點的配置的時候,Traffic server會自動將更改應用到叢集的其他節點。

通常的請求
http://d9.sina.com.cn/pfpghc/3106401f1783439d90720d6a2ead52bc.swf
變為如下請求
http://192.168.0.106:8080/pfpghc/3106401f1783439d90720d6a2ead52bc.swf
最終重定向到指定的圖片地址
http://www.baidu.com/image/in_011.png

開啟任意一個瀏覽器,在位址列中輸入上面的請求,可以看到swf變為一個圖片的請求了

二、正向和反向代理同時共存
最終我得到的結論是,對廣告必須使用正向代理加上remap方法。因為你必須確保一個網站所有的連結都經過ATS代理,如果這樣的設定
map http://10.10.110.31:8080/ http://news.sina.com.cn/
只能定向news.sina.com.cn這個域名,對d9.sina.com.cn這樣的域名沒有辦法。所以,這裡我只希望對極個別連結做重定向。
如何在正向代理的同時做remap替換?
下面是我的實現方法:使用正向代理+remap正則匹配重定向,主要是配置。
在預設安裝ATS的records.config中修改如下選項
CONFIG proxy.config.url_remap.pristine_host_hdr INT 1 改成0
CONFIG proxy.config.url_remap.remap_required INT 1 改成0,代表同時開啟正向代理和反向代理

下面配置remap.conf,我的主要目的是藉助remap實現regex_remap的功能,來實現對特定url的重定向或是改寫
在remap.conf加入如下內容
map http://d1.sina.com.cn/ http://d1.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile
map http://d2.sina.com.cn/ http://d2.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile
map http://d3.sina.com.cn/ http://d3.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile
map http://d4.sina.com.cn/ http://d4.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile
map http://d5.sina.com.cn/ http://d5.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile
map http://d6.sina.com.cn/ http://d6.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile
map http://d7.sina.com.cn/ http://d7.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile
map http://d8.sina.com.cn/ http://d8.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile
map http://d9.sina.com.cn/ http://d9.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile 

接著在regs.map中加入如下匹配規則
^/(.*).swf$ http://www.baidu.com/image/in_011.png @status=302 
這裡status表示使用302重定向
重啟伺服器

選擇一個瀏覽器,比如firefox,設定正向代理為該ATS的ip和埠,這裡是192.168.0.106:8080
然後輸入目的網站,比如我要測試的news.sina.com.cn,就可以看到我要的重定向的結果了。

三、對remap和regex_remap規則的說明
map http://d9.sina.com.cn/ http://d9.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile
表示將客戶端User-Agent傳送的host域以同樣的方式傳送給源站Original Sever(簡作OS),但是對path和query部分做正則匹配,匹配的規則是
^/(.*).swf$ http://www.baidu.com/image/in_011.png @status=302 
也就是將以http://d9.sina.com.cn/開頭,以.swf尾結尾的url對映到你指定的後一個地址,這裡是http://www.baidu.com/image/in_011.png,並以302的http status顯示。當然,你可以對映到其它的地址,結合這個匹配規則。

下面摘自趙永明在CU上的帖子(連結見參考網址1):

regex_remap是從master上port過來的, 用來解決去問號, 以及其他變態的rewrite規則等, 簡單說明如下:
如我們希望忽略cdn.zymlinux.net上的?後面的query, 我們只要配置remap.config
配置如下:
map http://cdn.zymlinux.net/ http://zymlinux.net/ @plugin=regex_remap.so @pparam=/tmp/regex_remap.config

並把regex_remap.config配置為:
.* http://source.zymlinux.net/$P

其中$P是URL中的path, 後面不跟query
當然, 這裡前面的".*"是可以再進一步細化的, 以達成精細控制的目的. 而這個配置是可以給每個remap規則配置一個不同的配置檔案, 極大的了增強了大家掌控的便利性.

這裡面 cdn.zymlinux.net和zymlinux.net分別是什麼?regex_remap.config裡的source.zymlinux.net又是什麼呢?
我們需要搞清楚這個關係,就是
cdn.zymlinux.net        是使用者在瀏覽器位址列中輸入的host部分,也稱域名
zymlinux.net     是ATS對上url重寫後的url的host部分,比如重寫的url是http://zymlinux.net/img/a.png?size=230*450
source.zymlinux.net    是上面重寫url重定向後的url的host部分,比如重定向url是http://source.zymlinux.net/$P,這裡做了正則匹配,那麼就是http://source.zymlinux.net/img/a.png

更詳細的說明, 請參照:
https://git-wip-us.apache.org/re ... emap/README;hb=HEAD

四、remap.config配置檔案的說明(部分翻譯)

使用remap.config允許你完成兩件事情:

1)在傳送給源伺服器(Origin Server)之前,重寫客戶端傳送的URL,

2)保護你的代理伺服器,只允許某些請求通過

使用ATS預設的配置檔案,至少要求配置一個remap規則,但是,這可以通過修改records.config中的下面的配置選項放鬆條件:

CONFIG proxy.config.url_remap.remap_required INT 0

支援的6種mapping規則如下:

map

map_with_referer

map_with_recv_port

reverse_map

redirect

redirect_temporary

這幾種map型別都支援正則表示式匹配,同時使用regex_的字首,但是有一些限制:

1)只有host域支援正則表示式, scheme,port和其它的field不支援

2)子模式的匹配個數只能最大到9,這意味著$0-$9能用於替換佔位符,$0表示整個輸入字串

3)擴充套件字串中的替換個數限制到10

下面是map支援正則表示式的一個例子:

上面的9條規則可以用下面的一條正則匹配表示:

regex_map http://d([1-9]).sina.com.cn/ http://d$1.sina.com.cn/ @plugin=regex_remap.so @pparam=maps.reg @pparam=profile

這裡http://d([1-9]).sina.com.cn/可以表示上面的9個域名,$1表示匹配到的1-9中的某個數字

參考網址
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3758890
http://bbs.chinaunix.net/thread-3768941-1-1.html