rewrite
我的Rewrite 測試【作業(yè)環(huán)境】1,服務(wù)器端:基于Redhat5的apache2.2.10;使用NAT 聯(lián)網(wǎng)的VMware 虛擬機(jī)[root@localhost conf]# uname -aLi
我的Rewrite 測試
【作業(yè)環(huán)境】
1,服務(wù)器端:
基于Redhat5的apache2.2.10;
使用NAT 聯(lián)網(wǎng)的VMware 虛擬機(jī)
[root@localhost conf]# uname -a
Linux localhost.localdomain 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:02 EDT 2007 i686 i686 i386 GNU/Linux
[root@localhost conf]# pwd
/usr/local/apache/conf
[root@localhost conf]# ../bin/httpd -v
Server version: Apache/2.2.10 (Unix)
Server built: Dec 11 2008 23:30:45
2,客戶端:
Windows XP,同時也是虛擬機(jī)的宿主機(jī);
瀏覽器使用Opera 10,使用Vmware 的NAT 網(wǎng)絡(luò)連接到虛擬機(jī)
【初始設(shè)置】
3,編譯安裝apache ,編譯的時候把Mod_rewrite打開;
安裝完成后啟用apache ,確認(rèn)可以在瀏覽器里show 出來“It's Work?!?然后添加www.a.com(alias a.com)www.b.com 和www.aaa.com 三個虛擬主機(jī) (虛擬主機(jī)的配置可參考附錄1)
學(xué)習(xí)基本的正則表達(dá)式;
在Apache 的documentRoot 內(nèi)建議相關(guān)測試文件:
[root@localhost htdocs]# pwd
/usr/local/apache/htdocs
[root@localhost htdocs]# cat 1.txt 2.txt test/3.txt > test/1.txt
this page 1
this's page 2
this's page 3
this's page 11111111111111
設(shè)置windows 宿主機(jī)的host 文件,將以下域名進(jìn)行解析: 192.168.118.131 www.a.com
192.168.118.131 a.com
192.168.118.131 www.b.com
192.168.118.131 www.aaa.com
第 1 頁
我的Rewrite 測試
【開啟Rewrite 功能】
4,打開httpd.conf ,在全局配置中檢查并添加下面的內(nèi)容:
,LoadModule rewrite_module modules/mod_rewrite.so
在虛擬主機(jī)www.a.com 內(nèi)添加下面的內(nèi)容
RewriteEngine on
RewriteCond {HTTP_HOST} ^a.com
RewriteRule ^(.*)$ http://www.a.com$1 [R,L]
RewriteLog /root/rewrite.log
RewriteLogLevel 3
嘗試在瀏覽器內(nèi)輸入a.com 進(jìn)行訪問,如果url 轉(zhuǎn)跳到www.a.com 則說 明規(guī)則設(shè)置成功,同時在/root/rewrite.log里應(yīng)該可以看到日志。
【入門級Rewrite 功能】
5,目標(biāo):將client 請求的主機(jī)前綴不是www.a.com 和192.168.118.131 的都跳轉(zhuǎn)到主機(jī)前綴為http://www.b.com。
實(shí)際案例:sohu.com ==》www.sohu.com ,bbs.sohu.com ==》club.sohu.com
在虛擬主機(jī)www.b.com 中添加如下內(nèi)容:
RewriteEngine on
RewriteCond {HTTP_HOST} !^www.b.com [NC]
RewriteCond {HTTP_HOST} !^www.a.com [NC]
RewriteCond {HTTP_HOST} !^192.168.118.131
RewriteCond {HTTP_HOST} !^$
RewriteRule ^(.*)$ http://www.b.com$1 [R,L]
RewriteLog /root/rewrite.log
RewriteLogLevel 3
在虛擬主機(jī)www.aaa.com 中添加如下內(nèi)容:
RewriteEngine on
RewriteCond {HTTP_HOST} !^www.a.com [NC]
RewriteCond {HTTP_HOST} !^192.168.118.131
RewriteCond {HTTP_HOST} !^$
RewriteRule ^(.*)$ http://www.b.com$1 [R,L]
RewriteLog /root/rewrite.log
RewriteLogLevel 3
實(shí)際效果:輸入www.a.com www.b.com都可直接訪問;
a.com==》www.a.com;www.aaa.com==>www.b.com
詳細(xì)參數(shù)說明:
RewriteEngine on
第2頁
我的Rewrite 測試
開啟Rewrite 功能
RewriteCond {HTTP_HOST} !^www.b.com [NC]
RewriteCond ——定義重寫發(fā)生的條件,可以理解為“篩選條件”
{HTTP_HOST}——篩選條件為HTTP_HOST
!^www.b.com [NC]——非www.b.com 開頭且不區(qū)分大小寫
RewriteCond {HTTP_HOST} !^www.a.com [NC]
,RewriteCond {HTTP_HOST} !^192.168.118.131
RewriteCond {HTTP_HOST} !^$
!^$——HTTP_HOST非空
RewriteRule ^(.*)$ http://www.b.com$1 [R,L]
RewriteRule ——為重寫引擎定義重寫規(guī)則,語法為:
RewriteRule Pattern Substitution [flags]
上文中的意思是將匹配過的信息轉(zhuǎn)換成www.b.com ,$1意思是“正則表達(dá)式中的域/參數(shù)傳遞” 在本實(shí)驗(yàn)中,$1是匹配了前文中的^(.*)$中的()內(nèi)的匹配內(nèi)容,既“/1.txt”, http://www.b.com $1 就等于 http://www.b.com/1.txt 了。
[R]——強(qiáng)制重定向,[L]——立即停止重寫操作,并不再應(yīng)用其他重寫規(guī)則。
RewriteLog /root/rewrite.log
RewriteLogLevel 3
日志存儲位置和日志的記錄等級(最高為8級)
TOP :
1)本測試中的Rewrite 是在虛擬主機(jī)已經(jīng)接到訪問請求后才開始轉(zhuǎn)換的,所以a.com 轉(zhuǎn)化為 www.a.com 而非www.b.com ;同理,其實(shí)RewriteCond 中不必強(qiáng)調(diào)主機(jī)不為www.a.com 。
2)RewriteCond 可以設(shè)置多個篩選條件,如上文,就是要符合四個篩選條件才發(fā)生轉(zhuǎn)換。 RewriteRule 也可以進(jìn)行多次轉(zhuǎn)換,“Pattern ”既可以是初始的HTTP_HOST頭信息, 也可以是經(jīng)過上一輪轉(zhuǎn)換處理過的結(jié)果,有興趣的人可以試一下將RewriteRule 改寫為: RewriteRule ^(.*)$ http://www.b.com [R]
RewriteRule ^(.*)$ http://www.a.com$1 [R,L]
3)測試的時候注意標(biāo)點(diǎn)為英文,還有該有空格的位置必須有空格
4)針對這些參數(shù)的詳解可以看附錄2中的鏈接——Rewrite 模塊參數(shù)詳解。
6,移動DocumentRoot 。www.a.com==》www.a.com/test
在虛擬主機(jī)www.a.com 中更改Rewrite 部分的設(shè)置:
RewriteCond {HTTP_HOST} ^a.com
RewriteRule ^(.*)$ http://www.a.com$1 [R]
RewriteCond {REQUEST_URI} !^/test/*
RewriteRule ^/(.*)$ /test/$1 [R,L]
第一行的RewriteCond 并沒有改動,還保留第四步的狀態(tài)。而第二行的改動是將代表“立即 停止重寫操作,并不再應(yīng)用其他重寫規(guī)則”的[L]去掉。第三行用了一個新的“篩選條件” “ {REQUEST_URI} ”,具體的規(guī)則就是 “!^/test/*” ,并非以/test/開頭的路徑 則執(zhí)行第四行的操作:^/(.*)$ == 》/test/$1,在域名和路徑之間加上"test/"。 所以了,如果入門級正則都不太清楚的同學(xué)還是先去補(bǔ)習(xí)下正則吧。
第3頁
我的Rewrite 測試
請輸入a.com/1.txt,如果正確轉(zhuǎn)換www.a.com/test/1.txt,則說明測試成功。
具體的轉(zhuǎn)化過程還要看日志,我們跟著rewrite 日志一步一步來解釋。
讓我們來cat rewrite.log,然后根據(jù)其中有代表性的記錄來進(jìn)行講解:
因?yàn)檩斎氲氖莂.com ,所以被第一條RewriteCond 所匹配,這條3級日志沒記錄,但也應(yīng)該清楚; init rewrite engine with requested uri /1.txt
馬上就要開始重寫請求的URI ——/1.txt了。
,applying pattern '^(.*)$' to uri '/1.txt'
應(yīng)用格式“ '^(.*)$'”去匹配“'/1.txt'”,肯定是能匹配成功了。
rewrite '/1.txt' -> 'http://www.a.com/1.txt'
根據(jù)第二條的RewriteRule ,把“1.txt ”寫到www.a 里,其中 $1= '^(.*)$' = '/1.txt'。 explicitly forcing redirect with http://www.a.com/1.txt
確認(rèn)了進(jìn)行rewrite ,a.com/1.txt ==》 www.a.com/1.txt;
這里說明一下,因?yàn)闈M足第三行的RewriteCond ,所以會應(yīng)用一次第四行的重寫規(guī)則; applying pattern '^/(.*)$' to uri 'http://www.a.com/1.txt' 現(xiàn)在將'^/(.*)$'去匹配 'http://www.a.com/1.txt'
escaping http://www.a.com/1.txt for redirect
讓“ http://www.a.com/1.txt”避開重定向。
redirect to http://www.a.com/1.txt [REDIRECT/302]
重定做了“一個輪回”,a.com/1.txt變成了www.a.com/1.txt
如果看不懂增加了www. 的URL 為什么仍然走了第三、第四條的匹配過程,請看附錄3的分實(shí)驗(yàn); init rewrite engine with requested uri /1.txt
applying pattern '^(.*)$' to uri '/1.txt'
怎么會又應(yīng)用了一次第二行的轉(zhuǎn)換規(guī)則,而且還沒有下文哪?詳情見附錄4。
applying pattern '^/(.*)$' to uri '/1.txt'
rewrite '/1.txt' -> '/test/1.txt'
explicitly forcing redirect with http://www.a.com/test/1.txt
escaping http://www.a.com/test/1.txt for redirect
redirect to http://www.a.com/test/1.txt [REDIRECT/302]
完成匹配和轉(zhuǎn)換,大功告成了,但是傻傻的apache 還會再做次匹配??
init rewrite engine with requested uri /test/1.txt
applying pattern '^(.*)$' to uri '/test/1.txt'
applying pattern '^/(.*)$' to uri '/test/1.txt'
pass through /test/1.txt
看上文你就知道為什么我需要在第三行的RewriteCond 強(qiáng)調(diào)URI 不能是/test/了, 實(shí)際試驗(yàn)中因?yàn)闆]加那個限定條件造成了死循環(huán)。
7, 根據(jù)路徑部分更改域名部分的測試。最常見的就是訪問某網(wǎng)站的“domain name.com/bbs”的時候轉(zhuǎn)到“bbs.domainname.com ”。
這步的實(shí)驗(yàn)是a.com/test/1.txt==》www.a.com/1.txt
下文是更改過的rewrite 功能,具體內(nèi)容就不詳解了,請根據(jù)5、6步的思路進(jìn)行分析。
第4頁
我的Rewrite 測試
RewriteCond {HTTP_HOST} !^www.a.com [NC]
RewriteCond {REQUEST_URI} ^/test/* [NC]
RewriteRule ^/test/(.*)$ http://www.a.com/$1 [NC,R,L]
【中級Rewrite 功能】
8,從URL 中提取部分信息進(jìn)行重組。
舉例一:www.sysinternals.com/ ==>> technet.microsoft.com/zh-cn/sysinternals/default.aspx 舉例二: user.qzone.qq.com/12345678 ==>> 12345678.user.qzone.qq.com
,舉例三:12345678.user.qzone.qq.com ==>> user.qzone.qq.com/12345678
1)嘗試將a.www.a.com==》www.a.com/a ,嘗試將1.txt.www.a.com ==>> www.a.com/1.txt 首先請編輯Winxp 宿主機(jī)也就是http 客戶端的host 文件,確?!癮.www.a.com ”“1.txt.www.a.com ”
這類奇怪的域名是可以解析的。然后在虛擬主機(jī)a 內(nèi)加入如下內(nèi)容:
RewriteCond {HTTP_HOST} !^www.a.com [NC]
RewriteRule ^(. ) {HTTP_HOST} [C]
RewriteRule ^(.*).www.a.com http://www.a.com/$1 [NC,R,L]
第一個RewriteCond 很簡單,就是說www.a.com 開頭的不解析,NC 就是不區(qū)分大小寫。
第一個RewriteRule ^(. ) {HTTP_HOST} [C] 是一個典型應(yīng)用,把用戶輸入完整的地址(GET 方式的參數(shù)
除外)作為參數(shù)傳給下一個規(guī)則。日志的動作記錄很清楚:rewrite '/' -> '1.txt.www.a.com'。但是對
這個典型應(yīng)用我只知其然而不知其所以然,隨時期望高手賜教。[C]是Chain 串聯(lián)下一個規(guī)則的意思,
如果這一段能應(yīng)用過去,才會應(yīng)用下一段,如果無法應(yīng)用該規(guī)則,則下一個RewriteRule 也不會應(yīng)用。
第二個RewriteRule 就很簡單了,考慮到實(shí)際應(yīng)用中不大可能出現(xiàn)1.txt.www.a.com 這樣的瘋子域名,可以
將正則從^(.*)改成^([^.] ),當(dāng)然用了這個域名之后1.txt 就不可能被匹配成$1了,瀏覽器會出現(xiàn)“Bad
Request ”錯誤。
針對此問題我曾經(jīng)發(fā)帖求助,,詳情見附錄5.
2)嘗試將www.a.com/1.php轉(zhuǎn)化1.txt.www.a.com;
RewriteCond {HTTP_HOST} ^www.a.com [NC]
RewriteCond {REQUEST_URI} .php$ [NC]
RewriteRule ^/(.*).php$ http://$1.txt.www.a.com [NC,R,L]
3) 嘗試將1_23txt.www.a.com轉(zhuǎn)化成 www.a.com/uid=1/abc/23txt.php
RewriteCond {HTTP_HOST} !^www.a.com [NC]
RewriteRule ^(. ) {HTTP_HOST} [C]
RewriteRule ^(.*)_(.*txt).www.a.com http://www.a.com/
uid=$1/abc/$2.php [NC,R,L]
PS:做這三個實(shí)驗(yàn)只是為了證明apache 的rewrite 功能可以做XXX ,而實(shí)際生活中應(yīng)該遇不到這么怪誕的要求。 9,內(nèi)部URL 重定向。
舉例:數(shù)不勝數(shù)、不勝枚舉了??那些給你們“個人個性域名的BLOG ”大部分都是用的一個泛域名解析,然后一個 URL 轉(zhuǎn)跳滿足你們的虛榮心的。比如說xxx.blog.163.com 和xxx.cublog.com 。但是cublog 和163blog 又不
太一樣。cublog 在輸入域名后會轉(zhuǎn)跳成blog.chinaunix.net/u1/UID/,而163的blog 始終顯示是xxx.blog.
163.com 。我無法猜測163用的啥技術(shù),但我們使用內(nèi)部url 重定向,就可以達(dá)到163blog 的效果。
目標(biāo):xiaoli.a.com/index.txt ==》www.a.com/xiaoli/index.txt
xiaowang.a.com/login.txt ==》www.a.com/xiaowang/login.txt
因?yàn)槭恰皟?nèi)部重定向”,所以從瀏覽器地址欄是看不出來測試結(jié)果的,我們需要先建立這些可以用瀏覽器瀏覽的文件。
[root@www htdocs]# mkdir xiaowang; mkdir xiaoli;echo
"zheshixiaowangdeindext" >>xiaowang/index.txt;echo "zheshi
xiaolidelogin" >>xiaoli/login.txt
然后把xiaoli.a.com 和xiaowang.a.com 加入winxp 的host 文件。
第5頁
我的Rewrite 測試
檢查下虛擬主機(jī)的 Server Alias,確保主機(jī)可以接受前面幾個域名。
ServerAlias a.com *.a.com
,在虛擬主機(jī)a 中配置如下內(nèi)容:
RewriteEngine on
RewriteCond {HTTP_HOST} ^[^www] .a.com$
首先要求HTTP 頭必須是xxxxxx.a.com ,但不能是www.a.com
RewriteRule ^(. ) {HTTP_HOST}$1 [C]
參數(shù)傳遞,將整個url 作為參數(shù)傳遞到下一個規(guī)則
RewriteRule ^([^.] ).a.com(.*)$
/usr/local/apache/htdocs/$1$2 [L]
這一句是關(guān)鍵點(diǎn),前面的^([^.] ).a.com(.*)$ 好理解,只是把URI 匹配了一下,后面的轉(zhuǎn)換結(jié)果是本地路徑, 且要是本地絕對路徑,這樣就是內(nèi)部URL 重定向。
10, 在多個目錄中搜索頁面.
我一時想不起來什么情況下會用到這個功能,但這確實(shí)是個有意思的功能。
目標(biāo):訪問請為www.a.com/1.txt ,首先嘗試載入/a/1.txt,如果頁面不存在則載入
/b/1.txt,如果頁面仍然不存在則載入/c/1.txt;如果都不匹配,則轉(zhuǎn)到錯誤頁面。
首先創(chuàng)建測試文件和文件夾:
mkdir a ;mkdir b;mkdir c;echo "a">a/1.txt;
echo "b">b/1.txt;echo "c">c/1.txt;echo "error">error.html
虛擬主機(jī)中的轉(zhuǎn)換規(guī)則如下(注,以更改html 根目錄為/web):
RewriteCond /web/a{REQUEST_FILENAME} -f
RewriteRule ^(. ) /web/a$1 [L]
RewriteCond /web/b{REQUEST_FILENAME} -f
RewriteRule ^(. ) /web/b$1 [L]
RewriteCond /web/c{REQUEST_FILENAME} -f
RewriteRule ^(. ) /web/c$1 [L]
RewriteCond {REQUEST_URI} !/error.html
RewriteRule ^(. ) http://www.a.com/error.html [L]
#RewriteRule !^/error.html$ http://www.a.com/error.html [L]
{REQUEST_FILENAME}是一個變量,經(jīng)過實(shí)際測試我發(fā)現(xiàn)和{REQUEST_URI}意思差不多,此問題 我已發(fā)帖咨詢http://bbs.linuxtone.org/thread-4212-1-1.html?!?f ”是將TestString 視為一個路徑名并測試它是否為一個存在的常規(guī)文件,所以第一個RewriteCond 的意思是檢查 /web/a{REQUEST_FILENAME},也就是/web/a/1.txt文件是否存在,如存在則進(jìn)行下一步。同 理,第二、第三個RewirteCond 是檢查下B/1.TXT或C/1.txt是否存在,而第四個則是為了防止死 循環(huán),#號注釋掉的部分可以用一條語句來替換掉上文中的兩條防止死循環(huán)的設(shè)置。
11, 根據(jù)時間進(jìn)行不同的URL 重定向。
又一個很有意思的功能,根據(jù)時間開進(jìn)行諸如白天/夜間,工作時間/休息時間的頁面切換。
目標(biāo):訪問www.a.com/index.html,7-19點(diǎn)轉(zhuǎn)跳到index_day.html,其他時間則轉(zhuǎn)跳
index_night.html。通過此案例我們可以了解一些Rewrite 模塊數(shù)值運(yùn)算的功能。 RewriteCond {TIME_HOUR}{TIME_MIN} >0700
RewriteCond {TIME_HOUR}{TIME_MIN} <1900
RewriteRule ^/index.html$ http://www.a.com/index_day.html [L]
RewriteRule ^/index.html$ http://www.a.com/index_night.html [L] 第6頁
,我的Rewrite 測試
場景一:凌晨三點(diǎn)訪問index.html 。{TIME_HOUR}{TIME_MIN}=0300
RewriteCond 第一步,0300>0700不成立,則第一個RewriteRule 不執(zhí)行,執(zhí)行第二個RewriteRule ,index. html==>index_night.html;然后www.a.com/index_night.html回爐重新進(jìn)行匹配,RewriteCond 部分照舊, 但在執(zhí)行RewriteRule 時,對方的匹配條件是^/index.html$,當(dāng)前uri 是/index_night.html,和 ^/index.html$不匹配,所以也不轉(zhuǎn)換。
場景二:中午十二點(diǎn)半訪問index.html ,{TIME_HOUR}{TIME_MIN}=1230
RewriteCond 第一步,1230>0700成立,繼續(xù)匹配;RewriteCond 第二步1230<1900成立;第一個RewriteRule 執(zhí)行,執(zhí)行index.html==>index_day.html。如果不加[L],則繼續(xù)執(zhí)行第二個RewriteRule ,但^/index. html$和index_day.html不匹配,也要從頭重新開始匹配;如果加上[L],則直接跳回開頭進(jìn)行匹配。第二輪 匹配的時候還是會因?yàn)閊/index.html$和index_day.html不匹配退出Rewrite 。
場景三:晚上九點(diǎn)一刻訪問index.html ,{TIME_HOUR}{TIME_MIN}=2115
RewriteCond 第一步2115>0700成立,但第二步2115<1900不成立,所以不執(zhí)行第一個RewriteRule ,而第二個 RewriteRule 執(zhí)行時^/index.html$匹配/index.html,可以正常執(zhí)行。轉(zhuǎn)換完成后進(jìn)行必然是徒勞無功的第 二輪Rerwrite 過程。
Top :可以在最前面加一個RewriteCond {REQUEST_URI} ^/index.html$來跳過第二輪的RewriteRule , 但相應(yīng)的也會增加兩次RewriteCond 。如何效率更高一些,大家見仁見智。
12,利用Rewrite 阻止一類盜鏈請求。
什么是盜鏈、盜鏈的危害這類話就不說了,直接切入正題。
在這個測試中,我們篩選盜鏈?zhǔn)歉鶕?jù)HTTP 訪問請求中的HTTP_REFERER變量來判斷是否該拒絕這個請求的。 這次盜鏈發(fā)生在同一個apache 的兩個虛擬主機(jī)之間,經(jīng)過同高手們確認(rèn),這樣做測試也是可行的。 首先,一般架站、編寫網(wǎng)頁的時候,圖片、音頻、視頻這類文件都會有專門的文件夾進(jìn)行存放,也方便管理。 所以我們首先在apache 服務(wù)器的DocumentRoot 目錄下新建個image 的目錄,并把a(bǔ).jpg 和error.jpg 都丟進(jìn)去。 然后,我們要寫如下這個HTML 文檔。
[root@lamp htdocs]# cat test.html
Test page

目標(biāo):同樣是訪問test.html 這個文檔,其中www.a.com/test.html是正當(dāng)訪問,而
www.b.com/test.html則是應(yīng)該被過濾掉的盜鏈請求,可拒絕請求或返回特定告警圖片。
實(shí)例:盜鏈的網(wǎng)易博客、qq 相冊的圖片在其他網(wǎng)站上顯示“此圖片屬于網(wǎng)易博客”“此圖片轉(zhuǎn)自QQ 空間”。 在虛擬主機(jī)a.com 中寫入這些內(nèi)容
RewriteCond {REQUEST_URI} !^/image/error.jpg
RewriteCond {HTTP_REFERER} !^http://www.a.com.*$ #RewriteRule .*jpg http://www.a.com/image/error.jpg [R,L] RewriteRule .*jpg image/error.jpg [R,L]
第一個RewriteCond 很簡單,要求URI 部分不是^/image/error.jpg,這是為了防止死循環(huán)。
第二個RewriteCond 從變量從{HTTP_REFERER}著手進(jìn)行篩選,{HTTP_REFERER}是整個頁面地址,從log 里看 就是http://www.b.com/test.html;這一條是為了防止誤殺自己的訪問請求。然后應(yīng)用RewriteRule 將jpg 請求 重定向到error.jpg 頁面。我們可以把篩選規(guī)則從jpg 換成png 或者mp3、avi ,達(dá)到限制其他對媒體文件的目的。 我們一般的URL 重寫都是用的“RewriteRule .*jpg http://www.a.com/image/error.jpg”這個 規(guī)則,但好像內(nèi)嵌圖片這類反盜鏈操作反而不能用這個方式來寫了,請高手指正并解惑一下。
,總結(jié)
在寫這個Rewrite 文檔之前,我不會看日志、不會用正則、甚至不會配apache 虛擬主機(jī);
但經(jīng)過寫這個文檔和這一系列測試,我的收獲可以用滿載而歸來形容。
本來想繼續(xù)寫高級Rewrite 重定向,但是手頭的工作實(shí)在是多,生活上的事情也
非常多,都擠到一起了,只好暫告一段落,日后再寫高級Rewrite 重定向了。
可愛的臥底 2009-11-12
第7頁
我的Rewrite 測試(附錄)
1,虛擬主機(jī)的默認(rèn)配置
NameVirtualHost *:80
ServerName www.a.com
ServerAlias a.com *.a.com
DocumentRoot /usr/local/apache/htdocs
ServerName www.b.com
DocumentRoot /usr/local/apache/htdocs
ServerName www.aaa.com
DocumentRoot /usr/local/apache/htdocs
2,Rewrite 模塊參數(shù)詳解
因?yàn)镽ewriteCond 在三級日志中并不顯示,且本例中的兩個RewriteRule ^(.*)$和^/(.*)$太無“標(biāo)志性”,太容易被混淆,特針對
a.com/1.txt==>www.a.com/test/1.txt做了一個醒目的專用規(guī)則,看了這個 日志以后你會發(fā)現(xiàn)電腦顯然沒有人腦那么聰明,很多我們“想當(dāng)然”的東西 電腦并不會去照辦。
下面是具體的Rewrite 規(guī)則。
RewriteCond {HTTP_HOST} ^a.com
RewriteRule ^(.*)$ http://www.a.com$1 [R]
RewriteCond {REQUEST_URI} !^/test/*
RewriteRule ^/(1.txt*)$ /test/$1 [R,L]
下面是具體的日志,希望這個日志能啟發(fā)下大家怎么更好的進(jìn)行測試,也希 望藉此提醒自己在業(yè)務(wù)服務(wù)器上部署復(fù)雜的Rewrite 時考慮下效率問題。 init rewrite engine with requested uri /1.txt
applying pattern '^(.*)$' to uri '/1.txt'
rewrite '/1.txt' -> 'http://www.a.com/1.txt'
explicitly forcing redirect with http://www.a.com/1.txt
,applying pattern '^/(1.txt*)$' to uri 'http://www.a.com/1.txt'
escaping http://www.a.com/1.txt for redirect
redirect to http://www.a.com/1.txt [REDIRECT/302]
init rewrite engine with requested uri /1.txt
applying pattern '^(.*)$' to uri '/1.txt'
applying pattern '^/(1.txt*)$' to uri '/1.txt'
rewrite '/1.txt' -> '/test/1.txt'
explicitly forcing redirect with http://www.a.com/test/1.txt
4,Rewrite 的具體過程的小細(xì)節(jié)(二);
經(jīng)過第一次轉(zhuǎn)換之后,在第二次轉(zhuǎn)換的時候,竟然又應(yīng)用了一次第二行的 RewriteCond ,而且這次匹配又沒有下文了直接應(yīng)用第四行的RewriteCond 附錄1
我的Rewrite 測試(附錄)
更改虛擬主機(jī)www.a.com 中的log 等級為最高級。
RewriteLogLevel 8
然后我們會發(fā)現(xiàn)多出來兩條日志:
applying pattern '^(.*)$' to uri '/1.txt'
RewriteCond: input='www.a.com' pattern='^a.com' => not-matched
一直以為是先做RewriteCond 后作RewriteRule ,沒想到在應(yīng)用了URI 匹配之后才去做
RewriteCond 對比,這里的對比結(jié)果是“not-matched ”,所以就沒應(yīng)用;
applying pattern '^/(.*)$' to uri '/1.txt'
RewriteCond: input='/1.txt' pattern='!^/test/*' => matched
這個對比結(jié)果就匹配了,就可以正式應(yīng)用了。
PS :據(jù)說八級日志很消耗系統(tǒng)資源,甚至三級日志都是最好別開,生產(chǎn)環(huán)境悠著點(diǎn)吧。
5,Rewrite 的具體過程的小細(xì)節(jié)(三);
在做URL 重定向的時候遇到了問題并發(fā)帖求助:
附錄2
附錄2
我的Rewrite 測試(附錄)
HTTP_USER_AGENT Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.2.15 Version/HTTP_REFERER null
HTTP_COOKIE null
HTTP_FORWARDED null
HTTP_HOST www.aaa.com 瀏覽器輸入的域名
HTTP_PROXY_CONNECTION null
HTTP_ACCEPT text/html, application/xml;q=0.9, application/xhtml xml,
,image/REMOTE_ADDR 192.168.118.1
REMOTE_HOST 192.168.118.1
REMOTE_PORT 三次的值都不一樣2073、2074、2076
REMOTE_USER null
REMOTE_IDENT null
REQUEST_METHOD GET
SCRIPT_FILENAME /index.html
PATH_INFO null
QUERY_STRING null
AUTH_TYPE null
DOCUMENT_ROOT /usr/local/apache/htdocs
SERVER_ADMIN you@example.com
SERVER_NAME www.aaa.com 虛擬主機(jī)的名字
SERVER_ADDR 192.168.118.131
SERVER_PORT 80
SERVER_PROTOCOL HTTP/1.1
SERVER_SOFTWARE Apache/2.2.10
TIME_YEAR 2009
TIME_MON 10 [root@www ~]# date
TIME_DAY 13 Tue Oct 13 16:06:59 CST 2009
TIME_HOUR 16
TIME_MIN 9
TIME_SEC 11
TIME_WDAY 2
TIME 20091013161256
IS_SUBREQ FALSE
如果正在處理的請求是一個子請求,它將包含字符串"true" ,否則就是"false" 。模塊為了解析URIAPI_VERSION 20051115:18
這是正在使用中的Apache 模塊API(服務(wù)器和模塊之間內(nèi)部接口) 的版本, 其定義位于include/ap_THE_REQUEST GET /index.html HTTP/1.1
這是由瀏覽器發(fā)送的完整的HTTP 請求行(比如:"GET /index.html HTTP/1.1")。它不包含任何瀏覽REQUEST_URI /index.html
這是在HTTP 請求行中所請求的資源(比如上述例子中的"/index.html")。 REQUEST_FILENAME /index.html
這是與請求相匹配的完整的本地文件系統(tǒng)的文件路徑名。
HTTPS off__