參考連接:http://slj.me/2009/04/apache-rewrite-regular/php
1.Rewrite規則簡介html
Rewirte主要的功能就是實現URL的跳轉,它的正則表達式是基於Perl語言。可基於服務器級的(httpd.conf)和目錄級的(.htaccess)兩種方式。若是要想用到rewrite模塊,必須先安裝或加載rewrite模塊。方法有兩種一種是編譯apache的時候就直接安裝rewrite模塊,別一種是編譯apache時以DSO模式安裝apache,而後再利用源碼和apxs來安裝rewrite模塊。web
基於服務器級的(httpd.conf)有兩種方法,一種是在httpd.conf的全局下直接利用RewriteEngine on來打開rewrite功能;另外一種是在局部裏利用RewriteEngine on來打開rewrite功能,下面將會舉例說明,須要注意的是,必須在每一個virtualhost裏用RewriteEngine on來打開rewrite功能。不然virtualhost裏沒有RewriteEngine on它裏面的規則也不會生效。正則表達式
基於目錄級的(.htaccess),要注意一點那就是必須打開此目錄的FollowSymLinks屬性(httpd.conf中的Option FollowSymLinks)且在.htaccess裏要聲明RewriteEngine on。apache
2. Apache mod_rewrite規則中的標記含義api
1 1) R[=code](force redirect) 強制外部重定向
2 強制在替代字符串加上http://thishost[:thisport]/前綴重定向到外部的URL.若是code不指定,將用缺省的302 HTTP狀態碼。 3 2) F(force URL to be forbidden)禁用URL,返回403HTTP狀態碼。 4 3) G(force URL to be gone) 強制URL爲GONE,返回410HTTP狀態碼。 5 4) P(force proxy) 強制使用代理轉發。 6 5) L(last rule) 代表當前規則是最後一條規則,中止分析之後規則的重寫。 7 6) N(next round) 從新從第一條規則開始運行重寫過程。 8 7) C(chained with next rule) 與下一條規則關聯 9 若是規則匹配則正常處理,該標誌無效,若是不匹配,那麼下面全部關聯的規則都跳過。 10 8) T=MIME-type(force MIME type) 強制MIME類型 11 9) NS (used only if no internal sub-request) 只用於不是內部子請求 12 10) NC(no case) 不區分大小寫 13 11) QSA(query string append) 追加請求字符串 14 12) NE(no URI escaping of output) 不在輸出轉義特殊字符 15 例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 將能正確的將/foo/zoo轉換成/bar?arg=P1=zoo 16 13) PT(pass through to next handler) 傳遞給下一個處理 17 例如: 18 RewriteRule ^/abc(.*) /def$1 [PT] # 將會交給/def規則處理 19 Alias /def /ghi 20 14) S=num(skip next rule(s)) 跳過num條規則 21 15) E=VAR:VAL(set environment variable) 設置環境變量
3.舉例說明瀏覽器
例一.下面是在一個虛擬主機裏定義的規則。功能是把client請求的主機前綴不是www.kiya.cn和70.40.213.183都跳轉到主機前綴爲http://www.kiya.cn,避免相同內容的網頁有多個指向的域名,如http://kiya.cn。服務器
1 NameVirtualHost 70.40.213.183:80 2 ServerAdmin slj@kiya.cn 3 DocumentRoot 「/web」 4 ServerName kiya.cn 5 RewriteEngine on #打開rewirte功能 6 RewriteCond %{HTTP_HOST} !^www.kiya.cn [NC] #聲明Client請求的主機中前綴不是www.kiya.cn,其中 [NC] 的意思是忽略大小寫 7 RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #聲明Client請求的主機中前綴不是70.40.213.183,其中 [NC] 的意思是忽略大小寫 8 RewriteCond %{HTTP_HOST} !^$ #聲明Client請求的主機中前綴不爲空 9 RewriteRule ^(.*) http://www.kiya.cn/ [L] #含義是若是Client請求的主機中的前綴符合上述條件,則直接進行跳轉到http://www.kiya.cn/,[L]意味着當即中止重寫操做,並再也不應用其餘重寫規則。這裏的.*是指匹配全部URL中不包含換行字符,()括號的功能是把全部的字符作一個標記,以便於後面的應用.就是引用前面裏的(.*)字符。
例二.將輸入 en.sicasoft.com 的域名時跳轉到www.sicasoft.comapp
1 RewriteEngine on 2 RewriteCond %{HTTP_HOST} ^en.sicasoft.com [NC] 3 RewriteRule ^(.*) http://www.sicasoft.com/ [L]
例三.賽卡軟件近期更換了域名,新域名爲www.sicasoft.com, 更加簡短好記。這時須要將原來的域名ss.kiya.cn, 以及論壇所在地址ss.kiya.cn/bbs/定向到新的域名,以便用戶能夠找到,而且使原來的論壇 URL 繼續有效而不出現 404 未找到,好比原來的http://ss.kiya.cn/bbs/tread-60.html, 讓它在新的域名下繼續有效,點擊後轉發到http://bbs.sicasoft.com/tread-60.html,而其餘網頁,如原先的http://ss.kiya.cn/purchase不會到二級域名bbs.sicasoft.com/purchase上,而是到www.sicasoft.com/purchase
按照這樣的要求重定向規則應該這樣寫:ide
1 RewriteEngine On 2 RewriteCond %{REQUEST_URI} ^/bbs/ 3 RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L] 4 RewriteCond %{REQUEST_URI} !^/bbs/ 5 RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]
例四.同時達到下面兩個要求:
1.用http://www.zzz.com/xxx.php 來訪問 http://www.zzz.com/xxx/
2.用http://yyy.zzz.com 來訪問 http://www.zzz.com/user.php?username=yyy 的功能
1 RewriteEngine On 2 RewriteCond %{HTTP_HOST} ^www.zzz.com 3 RewriteCond %{REQUEST_URI} !^user.php$ 4 RewriteCond %{REQUEST_URI} .php$ 5 RewriteRule (.*).php$ http://www.zzz.com/$1/ [R] 6 RewriteCond %{HTTP_HOST} !^www.zzz.com 7 RewriteRule ^(.+) %{HTTP_HOST} [C] 8 RewriteRule ^([^.]+).zzz.com http://www.zzz.com/user.php?username=$1
例五.
/type.php?typeid=* –> /type*.html
/type.php?typeid=*&page=* –> /type*page*.html
1 RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT] 2 RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]
例六.使用Apache的URL Rewrite配置多用戶虛擬服務器
要實現這個功能,首先要在DNS服務器上打開域名的泛域名解析(本身作或者找域名服務商作)。好比,我就把 *.kiya.us和 *.kiya.cn所有解析到了個人IP地址70.40.213.183上。
而後,看一下個人Apache中關於*.kiya.us的虛擬主機的設定。
1 ServerAdmin webmaster@kiya.us 2 DocumentRoot /home/www/www.kiya.us 3 ServerName dns.kiya.us 4 ServerAlias dns.kiya.us kiya.us *.kiya.us 5 CustomLog /var/log/httpd/osa/access_log.log」 common 6 ErrorLog /var/log/httpd/osa/error_log.log」 7 AllowOverride None 8 Order deny,allow 9 #AddDefaultCharset GB2312 10 RewriteEngine on 11 RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$ 12 RewriteRule ^(.+) %{HTTP_HOST}$1 [C] 13 RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
在這段設定中,我把*.kiya.cn和*.kiya.us 的Document Root都設定到了 /home/www/www.kiya.us
繼續看下去,在這裏我就配置了URL Rewrite規則。
1 RewriteEngine on #打開URL Rewrite功能 2 RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$ #匹配條件,若是用戶輸入的URL中主機名是相似 xxxx.kiya.us 或者 xxxx.kiya.cn 就執行下面一句 3 RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用戶輸入完整的地址(GET方式的參數除外)做爲參數傳給下一個規則,[C]是Chain串聯下一個規則的意思 4 RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/dev.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L] 5 # 最關鍵的是這一句,使用證則表達式解析用戶輸入的URL地址,把主機名中的用戶名信息做爲名爲un的參數傳給/home/www/dev.kiya.us目錄下的腳本,並在後面跟上用戶輸入的GET方式的傳入參數。並指明這是最後一條規則([L]規則)。注意,在這一句中指明的重寫後的地址用的是服務器上的絕對路徑,這是內部跳轉。若是使用http://xxxx這樣的URL格式,則被稱爲外部跳轉。使用外部跳轉的話,瀏覽着的瀏覽器中的URL地址會改變成新的地址,而使用內部跳轉則瀏覽器中的地址不發生改變,看上去更像實際的二級域名虛擬服務器。
設置後重啓Apache服務器就大功告成了!
例七.Rewrite 防盜鏈正則,不容許www.im286.com www.chinaz.com 這兩個網站盜鏈 , 其它的網站均可以盜鏈.
1 RewriteEngine On 2 RewriteCond %{HTTP_REFERER} chinaz.com [NC] 3 RewriteCond %{HTTP_REFERER} im286.com [NC] 4 RewriteRule .*\.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]