如果要想用到rewrite模塊,必須先安裝或加載rewrite模塊。方法有兩種一種是編譯apache的時(shí)候就直接安裝rewrite模塊,別一種是編譯apache時(shí)以DSO模式安裝apache,然后再利用源碼和apxs來(lái)安裝rewrite模塊。
基于服務(wù)器級(jí)的(httpd.conf)有兩種方法,一種是在httpd.conf的全局下直接利用RewriteEngine on來(lái)打開(kāi)rewrite功能;另一種是在局部里利用RewriteEngine on來(lái)打開(kāi)rewrite功能,下面將會(huì)舉例說(shuō)明,需要注意的是,必須在每個(gè)virtualhost里用RewriteEngine on來(lái)打開(kāi)rewrite功能。否則virtualhost里沒(méi)有RewriteEngine on它里面的規(guī)則也不會(huì)生效。
基于目錄級(jí)的(.htaccess),要注意一點(diǎn)那就是必須打開(kāi)此目錄的FollowSymlinks屬性且在.htaccess里要聲明RewriteEngine on。
2、舉例說(shuō)明:
例一.下面是在一個(gè)虛擬主機(jī)里定義的規(guī)則。功能是把client請(qǐng)求的主機(jī)前綴不是www.yiehua.com和70.40.213.183都跳轉(zhuǎn)到主機(jī)前綴為http://www.yiehua.com,避免相同內(nèi)容的網(wǎng)頁(yè)有多個(gè)指向的域名,如http://yiehua.com。
復(fù)制代碼代碼如下:
NameVirtualHost 70.40.213.183:80
ServerAdmin slj@yiehua.com
documentRoot “/web”
ServerName yiehua.com
RewriteEngine on #打開(kāi)rewirte功能
RewriteCond %{HTTP_HOST} !^www.yiehua.com[NC] #聲明Client請(qǐng)求的主機(jī)中前綴不是www.yiehua.com,其中 [NC] 的意思是忽略大小寫
RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #聲明Client請(qǐng)求的主機(jī)中前綴不是70.40.213.183,其中 [NC] 的意思是忽略大小寫
RewriteCond %{HTTP_HOST} !^$ #聲明Client請(qǐng)求的主機(jī)中前綴不為空
RewriteRule ^(.*) https://www.yiehua.com/ [L] #含義是如果Client請(qǐng)求的主機(jī)中的前綴符合上述條件,則直接進(jìn)行跳轉(zhuǎn)到https://www.yiehua.com/,[L]意味著立即停止重寫操作,并不再應(yīng)用其他重寫規(guī)則。這里的.*是指匹配所有URL中不包含換行字符,()括號(hào)的功能是把所有的字符做一個(gè)標(biāo)記,以便于后面的應(yīng)用.就是引用前面里的 (.*)字符。
例二.將輸入 en.yiehua.com的域名時(shí)跳轉(zhuǎn)到www.yiehua.com
復(fù)制代碼代碼如下:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^en.yiehua.com[NC]
RewriteRule ^(.*) https://www.yiehua.com/ [L]
例三.賽卡軟件近期更換了域名,新域名為www.yiehua.com, 更加簡(jiǎn)短好記。這時(shí)需要將原來(lái)的域名ss.yiehua.com, 以及論壇所在地址ss.yiehua.com/bbs/定向到新的域名,以便用戶可以找到,并且使原來(lái)的論壇 URL 繼續(xù)有效而不出現(xiàn) 404 未找到,比如原來(lái)的http://ss.yiehua.com/bbs/tread-60.html, 讓它在新的域名下繼續(xù)有效,點(diǎn)擊后轉(zhuǎn)發(fā)到http://bbs.yiehua.com/tread-60.html,而其他網(wǎng)頁(yè),如原先的http: //ss.yiehua.com/purchase不會(huì)到二級(jí)域名bbs.yiehua.com/purchase上,而是到 www.yiehua.com/purchase
按照這樣的要求重定向規(guī)則應(yīng)該這樣寫:
復(fù)制代碼代碼如下:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/bbs/
RewriteRule ^bbs/(.*) http://bbs.yiehua.com/$1 [R=permanent,L]
RewriteCond %{REQUEST_URI} !^/bbs/
RewriteRule ^(.*) https://www.yiehua.com/$1 [R=permanent,L]
3.Apache mod_rewrite規(guī)則重寫的標(biāo)志一覽
復(fù)制代碼代碼如下:
1) R[=code](force
REDirect) 強(qiáng)制外部重定向
強(qiáng)制在替代字符串加上http://thishost[:thisport]/前綴重定向到外部的URL.如果code不指定,將用缺省的302 HTTP狀態(tài)碼。
2) F(force URL to be forbidden)禁用URL,返回403HTTP狀態(tài)碼。
3) G(force URL to be gone) 強(qiáng)制URL為GONE,返回410HTTP狀態(tài)碼。
4) P(force proxy) 強(qiáng)制使用代理轉(zhuǎn)發(fā)。
5) L(last rule) 表明當(dāng)前規(guī)則是最后一條規(guī)則,停止分析以后規(guī)則的重寫。
6) N(next round) 重新從第一條規(guī)則開(kāi)始運(yùn)行重寫過(guò)程。
7) C(chained with next rule) 與下一條規(guī)則關(guān)聯(lián)
如果規(guī)則匹配則正常處理,該標(biāo)志無(wú)效,如果不匹配,那么下面所有關(guān)聯(lián)的規(guī)則都跳過(guò)。
復(fù)制代碼代碼如下:
8) T=MIME-type(force MIME type) 強(qiáng)制MIME類型
9) NS (used o
nly if no internal sub-request) 只用于不是內(nèi)部子請(qǐng)求
10) NC(no case) 不區(qū)分大小寫
11) QSA(query string
append) 追加請(qǐng)求字符串
12) NE(no URI escaping of output) 不在輸出轉(zhuǎn)義特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 將能正確的將/foo/zoo轉(zhuǎn)換成/bar?arg=P1=zoo
13) PT(pass through to next handler) 傳遞給下一個(gè)處理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 將會(huì)交給/def規(guī)則處理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳過(guò)num條規(guī)則
15) E=VAR:VAL(set enviro
nment variable) 設(shè)置環(huán)境變量
4.Apache rewrite例子集合
URL重定向
例子一:
同時(shí)達(dá)到下面兩個(gè)要求:
1.用http://www.zzz.com/xxx.php 來(lái)訪問(wèn) http://www.zzz.com/xxx/
2.用http://yyy.zzz.com 來(lái)訪問(wèn) http://www.zzz.com/user.php?username=yyy 的功能
復(fù)制代碼代碼如下:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.zzz.com
RewriteCond %{REQUEST_URI} !^user.php$
RewriteCond %{REQUEST_URI} .php$
RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]
RewriteCond %{HTTP_HOST} !^www.zzz.com
RewriteRule ^(.+) %{HTTP_HOST} [C]
RewriteRule ^([^.]+).zzz.com http://www.zzz.com/user.php?username=$1