卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

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__

標(biāo)簽: