Apache Rewrite規則詳解

參考連接: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 onapache

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]
相關文章
相關標籤/搜索