基于服務(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.9streets.cn和202.91.246.20都跳 轉(zhuǎn)到主機(jī)前綴為http://www.9streets.cn, 避免相同內(nèi)容的網(wǎng)頁(yè)有多個(gè)指向的域名,如http://9strees.cn。
NameVirtualHost 202.91.246.20:80
ServerAdmin [email protected]
DocumentRoot “/web”
ServerName 9streets.cn
RewriteEngine on #打開(kāi)rewirte功能
RewriteCond %{HTTP_HOST} !^www.9streets.cn [NC] #聲明Client請(qǐng)求的主機(jī)中前綴不是www.9streets.cn, 其中 [NC] 的意思是忽略大小寫(xiě)
RewriteCond %{HTTP_HOST} !^202.91.246.20 [NC] #聲明Client請(qǐng)求的主機(jī)中前綴不是202.91.246.20,其中 [NC] 的意思是忽略大小寫(xiě)
RewriteCond %{HTTP_HOST} !^$ #聲明Client請(qǐng)求的主機(jī)中前綴不為空
RewriteRule ^(.*) http://www.kiya.cn/ [L] #含義是如果Client請(qǐng)求的主機(jī)中的前綴符合上述條件,則直接進(jìn)行跳轉(zhuǎn)到http://www.kiya.cn/,[L]意味著立即停止重寫(xiě)操作,并 不再應(yīng)用其他重寫(xiě)規(guī)則。這里的.*是指匹配所有URL中不包含換行字符,()括號(hào)的功能是把所有的字符做一個(gè)標(biāo)記,以便于后面的應(yīng)用.就是引用前面里的 (.*)字符。
例二.將輸入 efou.net 的域名時(shí)跳轉(zhuǎn)到http:www.9streets.cn
RewriteEngine on
RewriteCond %{HTTP_HOST} ^efou.net [NC]
RewriteRule ^(.*) http://www.9streets.cn/ [L]
例三.賽卡軟件近期更換了域名,新域名為www.sicasoft.com, 更加簡(jiǎn)短好記。這時(shí)需要將原來(lái)的域名ss.kiya.cn, 以及論壇所在地址ss.kiya.cn/bbs/定向到新的域名,以便用戶可以找到,并且使原來(lái)的論壇 URL 繼續(xù)有效而不出現(xiàn) 404 未找到,比如原來(lái)的http://ss.kiya.cn/bbs/tread-60.html, 讓它在新的域名下繼續(xù)有效,點(diǎn)擊后轉(zhuǎn)發(fā)到http://bbs.sicasoft.com/tread-60.html,而其他網(wǎng)頁(yè),如原先的http: //ss.kiya.cn/purchase不會(huì)到二級(jí)域名bbs.sicasoft.com/purchase上,而是到 www.sicasoft.com/purchase
按照這樣的要求重定向規(guī)則應(yīng)該這樣寫(xiě):
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/bbs/
RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L]
RewriteCond %{REQUEST_URI} !^/bbs/
RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]
3.Apache mod_rewrite規(guī)則重寫(xiě)的標(biāo)志一覽
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ī)則的重寫(xiě)。
6) N(next round) 重新從第一條規(guī)則開(kāi)始運(yùn)行重寫(xiě)過(guò)程。
7) C(chained with next rule) 與下一條規(guī)則關(guān)聯(lián)
如果規(guī)則匹配則正常處理,該標(biāo)志無(wú)效,如果不匹配,那么下面所有關(guān)聯(lián)的規(guī)則都跳過(guò)。
8) T=MIME-type(force MIME type) 強(qiáng)制MIME類型
9) NS (used only if no internal sub-request) 只用于不是內(nèi)部子請(qǐng)求
10) NC(no case) 不區(qū)分大小寫(xiě)
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 environment variable) 設(shè)置環(huán)境變量
4.Apache rewrite例子集合
URL重定向
例子一:
同時(shí)達(dá)到下面兩個(gè)要求:
1.用http://www.9streets.cn/xxx.php 來(lái)訪問(wèn)http://www9streets.cn/xxx/
2.用http://vote.9streets.cn 來(lái)訪問(wèn) http://www.9streets.cn/user.php?username=vote的功能
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
例子二:
/type.php?typeid=* –> /type*.html
/type.php?typeid=*&page=* –> /type*page*.html
RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]
5.使用Apache的URL Rewrite配置多用戶虛擬服務(wù)器
要實(shí)現(xiàn)這個(gè)功能,首先要在DNS服務(wù)器上打開(kāi)域名的泛域名解析(自己做或者找域名服務(wù)商做)。比如,我就把 *.kiya.us和 *.kiya.cn全部解析到了我的IP地址70.40.213.183上。
然后,看一下我的Apache中關(guān)于*.kiya.us的虛擬主機(jī)的設(shè)定。
ServerAdmin [email protected]
DocumentRoot /home/www/www.kiya.us
ServerName dns.kiya.us
ServerAlias dns.kiya.us kiya.us *.kiya.us
CustomLog /var/log/httpd/osa/access_log.log” common
ErrorLog /var/log/httpd/osa/error_log.log”
AllowOverride None
Order deny,allow
#AddDefaultCharset GB2312
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
在這段設(shè)定中,我把*.kiya.cn和*.kiya.us 的Document Root都設(shè)定到了 /home/www/www.kiya.us
繼續(xù)看下去,在這里我就配置了URL Rewrite規(guī)則。
RewriteEngine on #打開(kāi)URL Rewrite功能
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$ #匹配條件,如果用戶輸入的URL中主機(jī)名是類似 xxxx.kiya.us 或者 xxxx.kiya.cn 就執(zhí)行下面一句
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用戶輸入完整的地址(GET方式的參數(shù)除外)作為參數(shù)傳給下一個(gè)規(guī)則,[C]是Chain串聯(lián)下一個(gè)規(guī)則的意思
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/dev.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
# 最關(guān)鍵的是這一句,使用證則表達(dá)式解析用戶輸入的URL地址,把主機(jī)名中的用戶名信息作為名為un的參數(shù)傳給/home/www/dev.kiya.us 目錄下的腳本,并在后面跟上用戶輸入的GET方式的傳入?yún)?shù)。并指明這是最后一條規(guī)則([L]規(guī)則)。注意,在這一句中指明的重寫(xiě)后的地址用的是服務(wù)器上 的絕對(duì)路徑,這是內(nèi)部跳轉(zhuǎn)。如果使用http://xxxx這樣的URL格式,則被稱為外部跳轉(zhuǎn)。使用外部跳轉(zhuǎn)的話,瀏覽著的瀏覽器中的URL地址會(huì)改變 成新的地址,而使用內(nèi)部跳轉(zhuǎn)則瀏覽器中的地址不發(fā)生改變,看上去更像實(shí)際的二級(jí)域名虛擬服務(wù)器。
設(shè)置后重啟Apache服務(wù)器就大功告成了!
Update May 1, 2009
今天上網(wǎng)看到了有人提一個(gè)問(wèn)題:
求Rewrite 防盜鏈正則
不允許www.companysz.com www.chinaz.com 這兩個(gè)網(wǎng)站盜鏈 , 其它的網(wǎng)站都可以盜鏈的規(guī)則怎么寫(xiě).
論壇中的答案是:
RewriteEngine On
RewriteCond %{HTTP_REFERER} chinaz.com [NC]
RewriteCond %{HTTP_REFERER} im286.com [NC]
RewriteRule .*/.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]
Update May 7, 2009
介紹一篇文章:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html
Update May 24, 2009
一、關(guān)于是否需要使用完全轉(zhuǎn)義,比如在 RewriteCond %{HTTP_REFERER} chinaz.com [NC] 中 把 chinaz.com 改成 chinaz/.com
答案是,兩者都是可以的。
二、今天在做 YOURcaddy.com (就是我去年做的PlanetCoachella的變形)的時(shí)候,在 GoDaddy 主機(jī)上無(wú)法正常轉(zhuǎn)向,后來(lái)找到了問(wèn)題:
在HostMonster以及我自己的機(jī)器上,是用
RewriteRule ^business/([^/.]+)$ biz/detail.php?name=$1 [L]
達(dá)到改寫(xiě)的。而在Godaddy主機(jī)上,是這樣:
RewriteRule ^business/([^/.]+)$ /biz/detail.php?name=$1 [L]
目標(biāo)文件前多了一個(gè)/
現(xiàn)在想想,可能是因?yàn)闆](méi)有指定RewriteBase,至于到底是不是我改日再驗(yàn)證一下。
三、添加兩個(gè)關(guān)于判斷 USER AGENT 例子和自動(dòng)添加.php擴(kuò)展名及自動(dòng)換.html到.php擴(kuò)展名的例子:
1
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* – [F,L] 這里”-”表示沒(méi)有替換,瀏覽器為IE和Opera的訪客將被禁止訪問(wèn)。
2
RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)/.html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php
限制目錄只能顯示圖片
< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*/.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ – [F,L]
< /IfModule>
Update Jun 10, 2009
補(bǔ)充,關(guān)于特定文件擴(kuò)展名的重寫(xiě)。
重寫(xiě)有某些擴(kuò)展名的文件:
RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]
如果要排除一些擴(kuò)展名:
RewriteRule !/.(js|ico|gif|jpg|JPG|png|PNG|css|pdf|swf)$ index.php
新聞熱點(diǎn)
疑難解答
圖片精選