Apache Rewrite規則筆記

本文主要介紹Apache環境下,如何使用mod_rewrite模塊完成URL重寫功能。 

開啓mod_rewrite模塊
使用URL重寫功能,須要安裝mod_rewrite模塊,查看已經加載的模塊。
# apachectl -D DUMP_MODULES
Loaded Modules:
 core_module (static)
 …..
 rewrite_module (shared)
 rpaf_module (shared)

若是沒有開啓mod_rewrite, 就須要配置mod_rewrite.so的路徑: 
LoadModule rewrite_module modules/mod_rewrite.so

# a2enmod rewrite

Apache2內置了mod_rewirte,在配置虛擬主機的配置文件VirtualHost部分打開引擎:RewriteEngine on

這句以後就可使用重寫語法了,VirtualHost文件部分的Directory配置必須是: 
<Directory /> 
Options Includes FollowSymLinks #容許使用符號連接 
AllowOverride All #容許目錄配置文件.htaccess。若是不使用是AllowOverride None 
</ Directory> 
利用mod_rewrite重寫URL主要使用兩個基本的指令RewriteRule和RewriteCond。 

RewriteRule指令
RewriteRule Pattern Substitution [Flags] 
在模式(Pattern)和替換(Substitution)中使用正則表達式來匹配相應的字符。 譬若有以下的URL: 
http://www.example.com/display.php?country=USA &state=California&city=San_Diego 
REQUEST_URI的值是「/country=USA &state=California&city=San_Diego」,要將國家州城市信息更友好的顯示給用,要顯示成這樣: 
http://www.example.com/USA/California/San_Diego 

一個最經常使用的正則就是(.*)。它含有兩個元素:一是「點」,表示任意字符;二是「星」,表示之前的所有字符。因此(.*)會匹配{REQUEST_URI}的全部字符。Rewrite重寫引擎的輸入串是{REQUEST_URI},也就是URL中出去域名以及「?」符號後的全部查詢字符。重定向的URL中要提取出「USA/California/San_Diego」,匹配模式正則表達式的原型是: 
(.*)/(.*)/(.*) 

以上正則,在{REQUEST_URI}中經過兩個「/」的分割存儲了三個值,爲了解決咱們具體問題,咱們得加一點限制――畢竟,第一個和最後一個原子能夠匹配任何字符。

開始,咱們能夠添加一些特殊的字符,好比表示正則「開始」或者「結束」,「^」字符表示正則的開始而「$」表示正則的結束。

^(.*)/(.*)/(.*)$ 
{REQUEST_URI}是以「/」開頭。Apache 在更改版本的時候會更改正則引擎,一代Apache要求有斜槓而二代Apache卻不容許!可是咱們能夠用^/?(?表示匹配字符自己或者前一個字符)來兼容兩個版本的Apache。再加上對字符匹配的限制,最終匹配模式是: 
^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$ 

完整表示以下: 
RewriteEngine on 
RewriteRule ^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$ display.php?country=$1 &state=$2&city=$3 [L] 
RewriteRule使用$1到$9引用模式()中匹配的內容,稱爲反向引用。對於URL: 
http://www.example.com/USA/California/San_Diego 
$1=USA,$2=California,$3=San_Diego 

RewriteRule選項
"redirect|R[=code]" 強制重定向,常常引用到觸發可見的定向。默認狀況下它是一個HTTP 302的臨時重定向,可是你能夠註明具體的HTTP 代碼,好比你能夠用[R=301]來代表這是一個永久重定向,這對搜索引擎抓取你重定向後的網頁至關有用。

"proxy|P"   強制爲代理 

"forbidden|F"   403 禁止,告訴Apache響應請求時不提供頁面。其原理就是Apache會發出一個403 HTTP相應,能夠保護網站不被未經受權的或者其餘盜鏈訪問。

"nocase|NC" 忽略正則表達式中的大小寫。它常常被用到{HTTP_HOST}服務器參數上,由於域名裏面是不會區分大小寫的。

"next|N"    回到第一條規則。可讓你的重寫條件循環匹配,當你不知道{REQUEST_URI}有多少字符進行匹配的時候頗有用。
 
"last|L"    最後一個規則。告訴Apache服務器一系列的條件或者是規則將在它出現後結束,換句話說就是[L]不出現,mod_rewrite將會一直執行。

"noescape|NE"      在輸出中不對URI做轉義。此標記阻止mod_rewrite對重寫結果應用常規的URI轉義規則。
通常狀況下,特殊字符(如‘%’, ‘$’, ‘;’等)會被轉義爲等值的十六進制編碼。 此標記能夠阻止這樣的轉義,以容許百分號等符號出如今輸出中,如: 
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 
可使‘/foo/zed’轉向到一個安全的請求‘/bar?arg=P1=zed’. 

"skip|S=N" 跳過下面的N條規則。 
 
RewriteCond指令
RewriteCond TestString CondPattern [Flags] 
RewriteCond指令定義了一個規則的條件,即在一個RewriteRule指令以前有一個或多個RewriteCond指令。 條件以後的重寫規則僅在當前URI與pattern匹配而且符合這些條件的時候纔會起做用。 
RewriteCond也有反向引用,但和RewriteRule中用$N引用不一樣,它使用%N反向引用。 
RewriteCond引用Apache變量%{ NAME_OF_VARIABLE},如%{HTTP_HOST}。

RewriteCond的條件模式(CondPattern)除了使用perl樣式正則表達式,還有額外的規則: 
1. 使用‘!’ 字符(驚歎號)來實現匹配的反轉 
2. ‘<CondPattern’ (詞典順序的小於)。將CondPattern視爲純字符串,與TestString以詞典順序相比較. 若是按詞典順序,TestString小於CondPattern,則爲真。相似還有>,=。 
3. ‘-d’ (是一個目錄[directory])。將TestString視爲一個路徑名並測試它是否存在並且是一個目錄. 
4. ‘-f’ (是一個常規的文件[file])。將TestString視爲一個路徑名並測試它是否存在並且是一個常規的文件. 
5. ‘-s’ (是一個非空的常規文件[size])。將TestString視爲一個路徑名並測試它是否存在並且是一個尺寸大於0的常規的文件. 
6. ‘-l’ (是一個符號鏈接[link])。將TestString視爲一個路徑名並測試它是否存在並且是一個符號鏈接. 
7. ‘-F’ (對子請求有效的業已存在的文件)。測試TestString是否一個有效的文件, 並且能夠被服務器當前已經配置的全部存取控制所存取。 它用一個內部子請求來作判斷,因爲會下降服務器的性能,請當心使用! 

RewriteCond選項
‘nocase|NC’ (no case)。它使測試忽略大小寫。此標記僅做用於TestString和CondPattern的比較, 而對文件系統和子請求的測試不起做用。

‘ornext|OR’ (or next condition)。它以OR方式組合若干規則的條件,而不是默認的AND。典型的例子以下: 
RewriteCond %{REMOTE_HOST} ^host1.* [OR] 
RewriteCond %{REMOTE_HOST} ^host2.* [OR] 
RewriteCond %{REMOTE_HOST} ^host3.* 
RewriteRule …some special stuff for any of these hosts… 
若是不用這個標記,則必須使用三個條件/規則。 
 
服務器變量
HTTP變量 
HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_ACCEPT 

連結和請求的變量 
REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT, REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE 

服務器內部變量 
DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE 

系統變量 
TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME 

mod_rewrite特殊值
API_VERSION, THE_REQUEST, REQUEST_URI, REQUEST_FILENAME 
 
URL重寫舉例
1. 給子域名加www標記 
RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC] 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteRule .? http://www.%1example.com%{REQUEST_URI} [R=301,L] 
這個規則抓取二級域名的%1變量,若是不是以www開始,那麼就加www,之前的域名以及{REQUEST_URI}會跟在其後。 

2. 去掉域名中的www標記 
RewriteCond %{HTTP_HOST} !^example\.com$ [NC] 
RewriteRule .? http://example.com%{REQUEST_URI} [R=301,L] 
 
3. 去掉www標記,可是保存子域名
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?example\.com)$ [NC] 
RewriteRule .? http://%1%{REQUEST_URI} [R=301,L] 
這裏,當匹配到1%變量之後,子域名纔會在%2(內部原子)中抓取到,而咱們須要的正是這個%1變量。 
 
4.防止圖片盜鏈
一些站長不擇手段的將你的圖片盜鏈在他們網站上,耗費你的帶寬。你能夠加一下代碼阻止這種行爲。 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/ [NC] 
RewriteRule \.(gif|jpg|png)$ – [F] 
若是{HTTP_REFERER}值不爲空,或者不是來自你本身的域名,這個規則用[F]FLAG阻止以gif|jpg|png 結尾的URL ,若是對這種盜鏈你是堅定鄙視的,你還能夠改變圖片,讓訪問盜鏈網站的用戶知道該網站正在盜用你的圖片。 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ [NC] 
RewriteRule \.(gif|jpg|png)$ http://www.example.com/hotlinked.gif [R=301,L] 
除了阻止圖片盜鏈連接,以上規則將其盜鏈的圖片所有替換成了你設置的圖片。 你還能夠阻止特定域名盜鏈你的圖片: 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?leech_site\.com/ [NC] 
RewriteRule \.(gif|jpg|png)$ – [F,L] 
這個規則將阻止域名黑名單上全部的圖片連接請求。 
固然以上這些規則都是以{HTTP_REFERER}獲取域名爲基礎的,若是你想改用成IP地址,用{REMOTE_ADDR}就能夠了。 
 
5.若是文件不存在重定向到404頁面 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d 
RewriteRule .? /404.php [L] 
-f匹配的是存在的文件名,-d匹配的存在的路徑名 

6.建立無文件後綴名連接 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^/?([a-zA-Z0-9]+)$ $1.php [L] 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^/?([a-zA-Z0-9]+)$ $1.html [L] 
若是文件是以.php爲後綴,這條規則將被執行。 
 
7. 強制使用HTTPS 
RewriteCond %{HTTPS} !on 
#RewriteCond %{SERVER_PORT} !^443$ 
RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC] 
RewriteRule ^(.*)$  https://%1example.com$1 [R=301,L] 
判斷HTTPS服務能夠判斷安全端口(通常是443),也能夠經過HTTPS變量。將example.com域名下全部url都強制使用https服務。 若是不判斷域名,能夠這樣: 
RewriteCond %{HTTPS} !on 
RewriteRule ^/?(.*)$  https://%{SERVER_NAME}/$1 [R=301,L] 
這裏的$1前面有斜槓/,實際上是匹配模式去掉了斜槓的緣由,和上面效果是同樣的。

8.將.html後綴名轉換成.php
前提是.html文件能繼續訪問的狀況下,更新你的網站連接。
RewriteRule ^/?([a-z/]+)\.html$ $1.php [L]
這不是一個網頁重定向,因此訪問者是不可見的。讓他做爲一個永久重定向(可見的),將FLAG修改[R=301,L]。

9.檢查查詢變量裏的特定參數
若是在URL裏面有一個特殊的參數,你可用RewriteCond鑑別其是否存在:
RewriteCond %{QUERY_STRING} !uniquekey=
RewriteRule ^/?script_that_requires_uniquekey\.php$ other_script.php [QSA,L]
以上規則將檢查{QUERY_STRING}裏面的uniquekey參數是否存在,若是{REQUEST_URI}值爲script_that_requires_uniquekey,將會定向到新的URL。

總結一些mod_rewrite和url匹配的技術細節 
內部處理
此模塊的內部處理極爲複雜,可是爲了使通常用戶避免犯低級錯誤,也讓管理員能充分利用其功能,在此仍然作一下說明。

API階段
首先,你必須瞭解Apache是分若干階段來處理HTTP請求的。Apache API對每一個階段都提供了一個hook程序。mod_rewrite使用兩個hook程序:
其一,從URL到文件名的轉換hook(用在讀取HTTP請求以後、受權開始以前); 
其二,修正hook(用在受權階段和讀取目錄級配置(.htaccess)以後、內容處理器激活以前)。 

因此,Apache收到一個請求而且肯定了響應主機(或虛擬主機)以後,重寫引擎即開始處理服務器級配置中的全部mod_rewrite指令(此時處於從URL到文件名轉換的階段),此階段完成後,最終的數據目錄便肯定了。接下來進入修正程序段並觸發目錄級配置中的mod_rewrite指令。這兩個階段並非涇渭分明的,但都實施了把URL重寫成新的URL或者文件名。雖然API最初不是爲此目的而設計的,可是如今它已經成爲了API的一種用途。記住如下兩點,會有助於更好地理解: 
1). 雖然mod_rewrite能夠將URL重寫爲新的URL或文件名,甚至將文件名重寫爲新的文件名,可是以前的API只提供從URL到文件名的hook。在Apache 2.0中,增長了兩個丟失的hook以使得處理過程更加清晰。不過這樣作並無給用戶帶來麻煩,用戶只需記住這樣一個事實:藉助從URL到文件名的 hook比最初API設計的目標功能更強大。

2). 使人難以置信的是,mod_rewrite還提供了目錄級的URL操做(.htaccess文件),而這些文件必須在將URL轉換成文件名以後纔會被處理(這是必須的,由於.htaccess存在於文件系統中)。換句話說,根據API階段,這時再處理任何URL操做已經太晚了。爲了解決這個"雞和蛋"的問題,mod_rewrite使用了一個小技巧:在進行一個目錄級的URL/文件名操做時,先把文件名重寫回相應的URL(一般這個操做是不可行的,可是參考下面的RewriteBase指令就能明白它是怎麼實現的了),而後,對這個新的URL創建一個新的內部的子請求,再從新開始API階段的執行。 

另外,mod_rewrite盡力使這些複雜的操做對用戶透明。但仍須記住:服務器級的URL操做速度快並且效率高,而目錄級的操做因爲這個"雞和蛋"的問題速度較慢並且效率也低。但從另外一個側面看,這倒是mod_rewrite得覺得通常用戶提供(局部限制的)URL操做的惟一方法。 

規則集的處理
當mod_rewrite在這兩個API階段中開始執行時,它會讀取配置結構中配置好的 (或者是在服務啓動時創建的服務器級的,或者是在遍歷目錄採集到的目錄級的)規則集,而後,啓動URL重寫引擎來處理(帶有一個或多個條件的)規則集。不管是服務器級的仍是目錄級的規則集,都是由同一個URL重寫引擎處理,只是最終結果處理不一樣而已。 

規則集中規則的順序是很重要的,由於重寫引擎是按一種特殊的順序處理的:逐個遍歷每一個規則(RewriteRule指令),若是出現一個匹配條件的規則,則可能回頭遍歷已有的規則條件(RewriteCond指令)。因爲歷史的緣由,條件規則是前置的,因此控制流程略顯冗長,細節見圖-1。 


圖-1:重寫規則集中的控制流 

可見,URL首先與每一個規則的Pattern匹配,若是匹配失敗,mod_rewrite將當即終止此規則的處理,繼而處理下一個規則。若是匹配成功,mod_rewrite將尋找相應的規則條件,若是一個條件都沒有,則簡單地用Substitution構造的新值來替換URL,而後繼續處理其餘規則;可是若是條件存在,則開始一個內部循環按其列出的順序逐個處理。對規則條件的處理有所不一樣:URL並不與模式進行匹配,而是首先經過擴展變量、反向引用、查找映射表等步驟創建一個TestString字符串,而後用它來與CondPattern匹配。若是匹配失敗,則整個條件集和對應的規則失敗;若是匹配成功,則執行下一個規則直到全部條件執行完畢。若是全部條件得以匹配,則以Substitution替換URL,而且繼續處理。 

推薦資源
Learn Apache mod_rewrite: 13 Real-world Examples,原文: 
http://www.sitepoint.com/article/apache-mod_rewrite-examples/ 
Learn Apache mod_rewrite: 13 Real-world Examples,譯文:
http://www.tsingfeng.com/?p=357 


Apache的Mod_rewrite 例子: php

http://dreamwaver.bokee.com/5692845.htmlhtml

 

目標 重寫設置 說明
規範化URL RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R] 將/~user重寫爲/u/user的形式
  RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R] 將/u/user末尾漏掉的/補上
     
規範化HostName RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC] 域名不合格
  RewriteCond %{HTTP_HOST} !^$ 不空
  RewriteCond %{SERVER_PORT} !^80$ 不是80端口
  RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R] 重寫
  RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]  
  RewriteCond %{HTTP_HOST} !^$  
  RewriteRule ^/(.*) http://fully.qualified.domain.name/$1 [L,R]  
     
URL根目錄轉移 RewriteEngine on  
  RewriteRule ^/$ /e/www/ [R] 從/移到/e/www/
     
末尾目錄補斜線 RewriteEngine on  
(目錄範圍內) RewriteBase /~quux/  
  RewriteRule ^foo$ foo/ [R] /~quux/foo是一個目錄,補/
     
  RewriteEngine on  
  RewriteBase /~quux/  
  RewriteCond %{REQUEST_FILENAME} -d 若是請文件名是個目錄
  RewriteRule ^(.+[^/])$ $1/ [R] URL末尾不是斜線時補上
     
Web集羣 RewriteEngine on  
  RewriteMap user-to-host txt:/path/to/map.user-to-host 用戶-服務器映射
  RewriteMap group-to-host txt:/path/to/map.group-to-host 組-服務器映射
  RewriteMap entity-to-host txt:/path/to/map.entity-to-host 實體-服務器映射
  RewriteRule ^/u/([^/]+)/?(.*) http://${user-to-host:$1|server0}/u/$1/$2 用戶均衡
  RewriteRule ^/g/([^/]+)/?(.*) http://${group-to-host:$1|server0}/g/$1/$2 組均衡
  RewriteRule ^/e/([^/]+)/?(.*) http://${entity-to-host:$1|server0}/e/$1/$2 實體均衡
  RewriteRule ^/([uge])/([^/]+)/?$ /$1/$2/.www/  
  RewriteRule ^/([uge])/([^/]+)/([^.]+.+) /$1/$2/.www/$3\  
     
URL根目錄搬遷 RewriteEngine on  
  RewriteRule ^/~(.+) http://newserver/~$1 [R,L] 到其它服務器
     
所用戶名首字母分 RewriteEngine on  
  RewriteRule ^/~(([a-z])[a-z0-9]+)(.*) /home/$2/$1/.www$3 內一層括號爲$2
     
NCSA imagemap移 RewriteEngine on  
植爲mod_imap RewriteRule ^/cgi-bin/imagemap(.*) $1 [PT]  
     
多目錄查找資源 RewriteEngine on  
  # first try to find it in custom/...  
  RewriteCond /your/docroot/dir1/%{REQUEST_FILENAME} -f  
  RewriteRule ^(.+) /your/docroot/dir1/$1 [L]  
  # second try to find it in pub/...  
  RewriteCond /your/docroot/dir2/%{REQUEST_FILENAME} -f  
  RewriteRule ^(.+) /your/docroot/dir2/$1 [L]  
  # else go on for other Alias or ScriptAlias directives,  
  RewriteRule ^(.+) - [PT]  
     
據URL設置環境變量 RewriteEngine on  
  RewriteRule ^(.*)/S=([^/]+)/(.*) $1/$3 [E=STATUS:$2]  
     
虛擬主機 RewriteEngine on  
  RewriteCond %{HTTP_HOST} ^www\.[^.]+\.host\.com$ 基於用戶名
  RewriteRule ^(.+) %{HTTP_HOST}$1 [C]  
  RewriteRule ^www\.([^.]+)\.host\.com(.*) /home/$1$2  
     
內外人有別 RewriteEngine on  
  RewriteCond %{REMOTE_HOST} !^.+\.ourdomain\.com$ 基於遠程主機
  RewriteRule ^(/~.+) http://www.somewhere.com/$1 [R,L]  
     
錯誤重定向 RewriteEngine on  
  RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f 不是regular文件
  RewriteRule ^(.+) http://webserverB.dom/$1  
     
程序處理特殊協議 RewriteRule ^xredirect:(.+) /path/to/nph-xredirect.cgi/$1 \ Xredirect協議
  [T=application/x-httpd-cgi,L]  
     
最近鏡像下載 RewriteEngine on  
  RewriteMap multiplex txt:/path/to/map.cxan 頂級域名與最近ftp服務器映射
  RewriteRule ^/CxAN/(.*) %{REMOTE_HOST}::$1 [C]  
  RewriteRule ^.+\.([a-zA-Z]+)::(.*)$ ${multiplex:$1|ftp.default.dom}$2 [R,L] 據頂級域名不一樣提供不一樣的FTP服務器
     
基於時間重寫 RewriteEngine on  
  RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700  
  RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900  
  RewriteRule ^foo\.html$ foo.day.html 白天爲遲早7點間
  RewriteRule ^foo\.html$ foo.night.html 其他爲夜間
     
向前兼容擴展名 RewriteEngine on  
  RewriteBase /~quux/  
  # parse out basename, but remember the fact  
  RewriteRule ^(.*)\.html$ $1 [C,E=WasHTML:yes]  
  # rewrite to document.phtml if exists  
  RewriteCond %{REQUEST_FILENAME}.phtml -f 若是存在$1.phtml則重寫
  RewriteRule ^(.*)$ $1.phtml [S=1]  
  # else reverse the previous basename cutout  
  RewriteCond %{ENV:WasHTML} ^yes$ 若是不存在$1.phtml,則保持不變
  RewriteRule ^(.*)$ $1.html  
     
文件更名(目錄級) RewriteEngine on 內部重寫
  RewriteBase /~quux/  
  RewriteRule ^foo\.html$ bar.html  
     
  RewriteEngine on 重定向由客戶端再次提交
  RewriteBase /~quux/  
  RewriteRule ^foo\.html$ bar.html [R]  
     
據瀏覽器類型重寫 RewriteCond %{HTTP_USER_AGENT} ^Mozilla/3.*  
  RewriteRule ^foo\.html$ foo.NS.html [L]  
  RewriteCond %{HTTP_USER_AGENT} ^Lynx/.* [OR]  
  RewriteCond %{HTTP_USER_AGENT} ^Mozilla/[12].*  
  RewriteRule ^foo\.html$ foo.20.html [L]  
  RewriteRule ^foo\.html$ foo.32.html [L]  
     
動態鏡像遠程資源 RewriteEngine on  
  RewriteBase /~quux/  
  RewriteRule ^hotsheet/(.*)$ http://www.tstimpreso.com/hotsheet/$1 [P] 利用了代理模塊
     
  RewriteEngine on  
  RewriteBase /~quux/  
  RewriteRule ^usa-news\.html$ http://www.quux-corp.com/news/index.html [P]  
     
反向動態鏡像 RewriteEngine on  
  RewriteCond /mirror/of/remotesite/$1 -U  
  RewriteRule ^http://www\.remotesite\.com/(.*)$ /mirror/of/remotesite/$1  
     
負載均衡 RewriteEngine on 利用代理實現round-robin效果
  RewriteMap lb prg:/path/to/lb.pl  
  RewriteRule ^/(.+)$ ${lb:$1} [P,L]  
     
  #!/path/to/perl  
  $| = 1;  
  $name = "www"; # the hostname base  
  $first = 1; # the first server (not 0 here, because 0 is myself)  
  $last = 5; # the last server in the round-robin  
  $domain = "foo.dom"; # the domainname  
  $cnt = 0;  
  while (<STDIN>) {  
  $cnt = (($cnt+1) % ($last+1-$first));  
  $server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);  
  print "http://$server/$_";  
  }  
  ##EOF##  
     
靜態頁面變腳本 RewriteEngine on  
  RewriteBase /~quux/  
  RewriteRule ^foo\.html$ foo.cgi [T=application/x-httpd-cgi]  
     
阻擊機器人 RewriteCond %{HTTP_USER_AGENT} ^NameOfBadRobot.*  
  RewriteCond %{REMOTE_ADDR} ^123\.45\.67\.[8-9]$  
  RewriteRule ^/~quux/foo/arc/.+ - [F]  
     
阻止盜連你的圖片 RewriteCond %{HTTP_REFERER} !^$  
  RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC] 本身的鏈接可不能被阻止
  RewriteRule .*\.gif$ - [F]  
     
  RewriteCond %{HTTP_REFERER} !^$  
  RewriteCond %{HTTP_REFERER} !.*/foo-with-gif\.html$  
  RewriteRule ^inlined-in-foo\.gif$ - [F]  
     
拒絕某些主機訪問 RewriteEngine on  
  RewriteMap hosts-deny txt:/path/to/hosts.deny  
  RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]  
  RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND  
  RewriteRule ^/.* - [F]  
     
用戶受權 RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend1@client1.quux-corp\.com$  
  RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend2@client2.quux-corp\.com$  
  RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend3@client3.quux-corp\.com$  
  RewriteRule ^/~quux/only-for-friends/ - [F]  
     
外部重寫程序模板 RewriteEngine on  
  RewriteMap quux-map prg:/path/to/map.quux.pl  
  RewriteRule ^/~quux/(.*)$ /~quux/${quux-map:$1}  
     
  #!/path/to/perl  
  $| = 1;  
  while (<>) {  
  s|^foo/|bar/|;  
  print $_;  
  }  
     
搜索引擎友好 RewriteRule ^/products$ /content.php  
  RewriteRule ^/products/([0-9]+)$ /content.php?id=$1  
  RewriteRule ^/products/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$) /marso/content.php?id=$1&sort=$2&order=$3&start=$4
相關文章
相關標籤/搜索