參考:http://blog.csdn.net/fanxiaojie119/article/details/5353186javascript
第一章:軟件介紹
ISAPI_Rewrite 是一款適用於IIS的功能強大的基於正則表達式的URL處理模塊。它兼容Apache的mod_rewrite的語法,從而使僅僅複製.htaccess文件就把配置從appach移植到IIS中或者從IIS移值到appach中變成可能。請參閱3.2兼容性圖表這一節。
ISAPI_Rewrite最重要的功能:
? ISAPI_Rewrite提供了和Apach mod_rewrite相同的句法和行爲,使僅僅拷貝.htaccess文件就完成配置移植成爲功能。(要想閱讀更多關於與mod_rewrite的兼容性,請參閱3.2兼容性圖表這一節。)
? 正則表達式支持靈活而強大的配置。
? 極速並且容易升級的純C++代碼。
? 真正的分佈式配置:實時監控服務器全局級別、虛擬主機(網站)級別、目錄級別的.htaccess文件。
? 隔離性:用戶級配置隻影響本地用戶環境,從而使ISAPI_Rewrite成爲Web主機提供商的理想解決方案。
重要的應用示例:
? 搜索引擎優化。
? 一臺Web服務器的代理內容通過另外一臺web服務器。
? 防止內容被吸血(盜鏈)。
? 阻斷特定主機、反向連接或者煩人的搜索機器人。
? 內容商議:向不一樣的語言用戶或者不一樣的瀏覽器用戶提供不一樣的文件。示例
? 爲羣集式服務器架構模擬負載均衡。
訂價資料
? 45天的試用期
? 單機版99美圓
? ISAPI_Rewrite精簡版是免費的。在這裏能夠看到受限的細節說明。
? 大宗採購可議折扣。java
2.1系統要求
ISAPI_Rewrite能夠被安裝在下列操做系統中:
? Windows 2000 with IIS 5
? Windows XP with IIS 5.1
? Windows Server 2003 with IIS 6.0
? Windows Vista with IIS 7.0
? Windows Server 2008 with IIS 7.0
在安裝ISAPI_Rewrite以前,操做系統中必須先安裝IIS。
32位和64位的Windows版本都是支持的,可是你必須下載32位版和64位版兩種不一樣的安裝包。Windows Installer 2.0必須運行安裝程序。你能夠從微軟的網站上下載到最新版本的Windows Installer。
在Windows Vista和Windows Server 2008上安裝ISAPI_Rewrite,還必須先安裝下面兩個模塊(默認狀況下這兩個模塊是不安裝的)
? ISAPI過濾器
? ISAPI 擴展git
2.2安裝程序
在運行安裝包以前請先閱讀系統要求部分。下載並安裝某個版本的ISAPI_Rewrite.msi,依照安裝嚮導的說明操做。安裝過程是自動的,並有自我描述。ISAPI_Rewrite在自動安裝過程當中必須重啓IIS。下列服務必須被重啓:IISADMIN、W3SVC。不須要手工把任何ISAPI篩選器或者擴展加入到網站或者全局列表中。它可以在安裝和配置過程當中自動完成。
命令行安裝
ISAPI_Rewrite也可以經過命令行進行後臺安裝。請使用如下命令行語法來安裝:web
msiexec /i ISAPI_Rewrite3.msi /qn AcceptEULA=Yes REGISTRATIONCODE=Code REGISTRATIONNAME=Name
用命令行來後臺反安裝ISAPI_Rewrite請使用下面的語法:正則表達式
msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes
2.3手工安裝
要手工安裝ISAPI_Rewrite的話,你必須下載不一樣的手工安裝包包含全部必須的文件。ISAPI_Rewrite精簡版不支持手工安裝。你能夠安裝所有功能或者僅僅安裝它們中的一部分。
手工安裝包包含下列文件:
? ISAPI_Rewrite.dll - 這是ISAPI篩選器自己。
? ISAPI_RewriteProxy.dll - 這是爲代理操做的ISAPI擴展模塊必不可少的。
? license.rtf - EULA的產品許可證。
? ISAPI_Rewrite.chm - .文檔文件。
? httpd.conf - 全局配置文件示例。
安裝ISAPI_Rewrite,首先你必須在你在IIS系統中註冊ISAPI_Rewrite.dll做爲ISAPI篩選器。按默認ISAPI_Rewrite.dll文件是用來做爲全局ISAPI篩選器的。並且它還可以被安裝到某個特定的網站裏,你須要記住在同一時間段裏只有一個ISAPI_Rewrite.dll實例可以加載到一個IIS工做進程裏,這意味着若是你決定把ISAPI_Rewrite的ISAPI篩選器單獨地安裝到每一個站點裏的話,你必須把這些站點切換高隔離模式,從而爲這些網站產生獨立的工做進程。若是你須要在每一個站點上分別安裝ISAPI_Rewrite,咱們一般會建議改成在整個IIS上全局地安裝它。
在Window 2000,Window XP 和Windows Server 2003中註冊ISAPI 篩選器,不管是整個IIS服務器要用它仍是個別WEB網站要用它,都要用IIS 的MMC管理單元來把ISAPI_Rewrite.dll添到ISAPI篩選器列表。在Windows Vista和Windows Server 2008中首先你須要安裝可選IIS組件:萬維網服務、應用程序開發功能、ISAPI篩選器。
若是你須要代理服務器功能,你還須要將ISAPI_RewriteProxy.dll註冊爲ISAPI擴展來侍服文件擴展名「*. rwhlp」。在不一樣的IIS版本中要求不一樣的操做。請參閱你管理的IIS版本的文檔來了解如何註冊一個新的ISAPI擴展並把它映射到IIS系統的文件擴展名上。在Windows Vista和windows server 2008首先必須安裝可選的IIS組件:萬組網服務、應用程序開發功能、ISAPI篩選器。使用短路徑名(8.3模式)做爲ISAPI_RewriteProxy.dll的模塊路徑,若是路徑裏有一個空格字符,IIS載入這個模塊時將失敗。
把httpd.conf文件放在ISAPI_Rewrite.dll文件的同一目錄下並編輯它。
把下列兩行內容放到httpd.conf文件中以註冊ISAPI_Rewrite 產品:算法
RegistrationName=Your registration nameRegistrationCode=REG-CODE-PROVIDED-FROM-HELICON
依照「運行ISAPI_Rewrite的權限需求」這一部分的說明來檢查文件系統權限。express
2.4反安裝
反安裝程序會刪除全部安裝程序所生成的文件、從管理元庫中註銷篩選器,並刪除全部由安裝程序所添加的其它管理元庫變化。若是用戶決定在反安裝過程當中保留用戶文件的話,下列用戶數據文件在反安裝後會被留下來。windows
文件名 | 說明 |
Program Files/Helicon/ISAPI_Rewrite/httpd.conf | 用戶規則的主配置文件 |
Program Files/Helicon/ISAPI_Rewrite/error.log | 包含錯誤日誌的文件 |
Program Files/Helicon/ISAPI_Rewrite/rewrite.log | 包含重寫日誌的文件 |
.htaccess (various folders) | 用戶建立的含有規則的配置文件 |
「刪除用戶建立的文件」的選項在將反安裝過程當中提供給用戶。若是啓用這個選項則卸載程序也將刪除位於Program Files文件夾裏用戶建立的文件。 .htaccess文件不會被刪除。
要用命令行後臺卸載ISAPI_Rewrite,請使用下面的語法:後端
msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes
2.5運行ISAPI_Rewrite所需的權限
在一個乾淨的默認Windows系統上自動安裝ISAPI_Rewrite不要求任何權限調整。可是一些其它產品好比說Plesk、IIS鎖定工具的安裝,等等,可能收緊服務器的安全性,並妨礙ISAPI_Rewrite的正常運行。下面是ISAPI_Rewrite的權限需求的列表單子:
在Windows 2000、Windows XP和Windows 2003的IIS5兼容模式下,篩選器運行在System賬戶下的inetinfo.exe進程中。那個system賬戶至少得被授予放置ISAPI_Rewrite安裝文件的那個文件夾的「讀取」和「目錄瀏覽」的權限。咱們還建議給予system賬號對這個文件夾的通常修改權。這將容許生成一些包含解析或者其它錯誤的文件。system賬號還必須在任何包含了.htaccess文件的網站文件夾裏一樣被授予這些權限,不然ISAPI_Rewrite將不能加載並監視它。
請稍留意ISAPI_Rewrite安裝目錄上的任何一點拒絕權限設置,由於在Windows 操做系統中,拒絕權限優先於任何容許權限記錄。
在Windows 2003的自然IIS模式(WPI模式)以及Windows Server 2008中,不管是篩選器仍是代理服務都運行在每一個網站相應的運行程序池的w3p.exe工做進程中,每一個應用程序池均可以使用它本身的定製來配置,這可能使權限設置成了一種複雜的工做。然而,在一個正確的IIS配置中,每一個使用中的定製必須是IIS_WPG組的一個成員。所以,IIS_WPG組能夠被用來代替System賬號去分配前面所寫的權限需求。
在Windows Vista 中權限配置是和Windows 2003的配置差很少的,只是它沒有IIW_WPG組。因此,全部的WPI賬號(通常Network Service是它的唯一賬號)都必須授予上述必需權限。
此外,爲了讓代理服務功能能工做,你必須在網站屬性或者運行代理服務的web應用程序的屬性中給予一個「純腳本」的執行權限。api
2.6MSI的自定義行爲自定義行爲
自定義行爲 | 說明 |
WiseAltStartup 自動智能啓動 |
爲運行在延時模式中的自定義行爲保存屬性的當前狀態。 使用一個可執行文件(dll) 發生在:安裝、反安裝。 |
WiseCleanup 智能清理 |
這個行爲被調用來清理上一個自定義行爲所遺留下的臨時文件 使用一個可執行文件(dll) 發生在:安裝、反安裝。 |
WiseStartup 智能啓動 |
這個行爲使調用一個.dll文件或者提取必要Wisescript.exe文件和.dll文件的行爲能夠傳遞參數。 使用一個可執行文件(dll) 發生在: 安裝、反安裝 |
WiseUpgradeCheck 智能可選擇地升級 |
這個行爲被調用來解決當Windows安裝程序運行時不檢測應用程序的早期版本的問題。 使用一個可執行文件(dll) 發生在:安裝。 |
WiseUpgradeCheckEx 智能預選升級 |
添加這個行爲用來解決當Windows安裝程序運行時不檢測應用程序的早期版本的問題。 使用一個可執行文件(dll) 發生在:安裝。 |
WiseGetIISVersion 智能得到IIS版本 |
對主要的IIS版本設置屬性(IISVERSION). 使用一個可執行文件(dll) 發生在:安裝。 |
RegisterFilterInMetabase 在管理元庫中註冊篩選器 |
這個行爲添加一個命名爲ISAPI_Rewrite3的全局ISAPI篩選器到IIS管理元庫裏 IIS5, IIS6 管理元庫: IIS:/LM/W3SVC/Filters/ add key ISAPI_Rewrite3 IIS:/LM/W3SVC/Filters/FilterLoadOrder append "ISAPI_Rewrite3" 使用一個可執行文件(dll) 發生在:安裝。 |
RemoveFilterFromMetabase 從管理元庫中刪除篩選器 |
這個行爲從IIS管理元庫裏移除了名爲ISAPI_Rewrite3的全局ISAPI篩選器。 IIS5, IIS6 管理元庫: IIS://localhost/W3SVC/LM/W3SVC/Filters/ delete key ISAPI_Rewrite3 IIS:/LM/W3SVC/Filters/FilterLoadOrder remove"ISAPI_Rewrite3" 使用一個可執行文件(dll) 發生在:反安裝、回滾。 |
AddApplicationExtension 添加應用程序擴展 |
只用於Windows 2003機器添加ISAPI_RewriteProxy.dll到ISAPI擴展中,並使Web服務器擴展名列表中的這個ISAPI擴展名可用。 IIS6管理元庫: IIS:/LM/W3SVC/ adds entry to the在管理元庫屬性 WebSvcExtRestrictionList中增長metabase property "ISAPI_Rewrite3 proxy"條目; 在管理元庫屬性 ApplicationDependencies 增長"ISAPI_Rewrite3 proxy;ISAPI_Rewrite3"條目; 使用一個可執行文件(dll) 發生在:安裝。 |
RemoveApplicationExtension 刪除應用程序擴展 |
只用於Windows 2003從ISAPI擴展中刪除ISAPI_RewriteProxy.dll,並從web服務器擴展名列表中刪除這個ISAPI擴展名。 IIS6管理元庫: IIS:/LM/W3SVC/ 1.從管理元庫屬性 WebSvcExtRestrictionList 中刪除"ISAPI_Rewrite3 proxy"條目; 2.從管理元庫屬性 ApplicationDependencies中刪除"ISAPI_Rewrite3 proxy;ISAPI_Rewrite3"條目; 使用一個可執行文件(dll) 發生在:反安裝、回滾。 |
RegisterExtensionInScriptMap 在腳本映射中註冊擴展 |
在IIS管理員庫中將ISAPI_RewriteProxy.dl註冊爲ISAPI擴展來處理*.rwhlp文件擴展名 IIS5,IIS6管理元庫: IIS://LM/W3SVC/ 使用一個可執行文件(dll) 發生在:安裝。 |
RemoveExtensionFromScriptMap 從腳本映射中刪除擴展 |
從IIS管理元庫中移除做爲ISAPI擴展、用於處理*.rwhlp文件擴展名的ISAPI_Rewrite.dll的註冊信息 IIS5, IIS6管理元庫: IIS://LM/W3SVC/ 使用一個可執行文件(dll) 發生在:反安裝、回滾。 |
GetServisesStatus 得到服務狀態 |
保存IISADMIN、W2WC、NNTP、SMTP 和FTP 服務的當前狀態 建立msi屬性: [SERVICES_STATUS] 使用一個可執行文件(dll) 發生在: 安裝、反安裝。 |
StartServicesEx 按預設開啓服務 |
根據狀態預設來啓動ISADMIN、W2WC、NNTP、 SMTP 和 FTP 服務 使用msi 屬性: [SERVICES_STATUS] 使用一個可執行文件(dll) 發生在: 安裝、反安裝。 |
SaveProductID 保存產品ID |
若是要註冊產品的話,保存REGISTRATIONNAME和REGISTRATIONCODE的屬性值 使用msi 屬性: [REGISTRATIONNAME] , [REGISTRATIONCODE]; 使用文件: [INSTALLDIR]\ISAPI_Rewrite3\httpd.conf 使用一個可執行文件(dll) 發生在: 安裝。 |
Check32bitMode 檢測32位模式 |
在64位系統中檢查32位IIS兼容模式是否可用,從而安裝正確的ISAPI篩選器版本。IIS6, IIS7 使用管理元庫路徑: IIS://LM/W3SVC/AppPools property Enable32bitAppOnWin64; 使用msi 屬性:[ENABLE32BITAPPONWIN64] 檢查一個32位的應用程序是否能運行在一臺安裝了64位版本的windows的電腦上。 使用javascript腳本 發生在: 安裝。 |
CheckIISModules 檢測IIS模塊 |
在IIS7的機器上檢查是否須要安裝IsapiFilterModule和IsapiModule模塊 IIS7 管理元庫路徑: <system.webServer> <globalModules> <add name="IsapiModule" image="%windir%\System32\inetsrv\isapi.dll" /> <add name="IsapiFilterModule" image="%windir%\System32\inetsrv\filter.dll" /> </globalModules> </system.webServer> 使用javascript腳本 發生在: 安裝。 |
AddGlobalIsapiFilter 添加全局ISAPI篩選器 |
只用於IIS7的機器。這個行爲會在IIS管理元庫裏添加一個命名爲ISAPI_Rewrite3的全局ISAPI_Rewrite篩選器 IIS7的管理元庫路徑: <configuration> <system.webServer> <isapiFilters> <filters> <filter name="ISAPI_Rewrite3" path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_Rewrite.dll" enabled="true" enableCache="false"> </filter> </filters> </isapiFilters> </system.webServer> </configuration> 使用JavaScript腳本 發生在:安裝。 |
DeleteGlobalIsapiFilter 刪除全局ISAPI過濾器 |
只用於IIS7的機器,這個行爲會從IIS管理元庫中刪除名爲ISAPI_Rewrite3的全局ISAPI篩選器。 IIS7的管理元庫路徑: <configuration> <system.webServer> <isapiFilters> <filters> <filter name="ISAPI_Rewrite3" path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_Rewrite.dll" enabled="true" enableCache="false" > </filter> </filters> </isapiFilters> </system.webServer> </configuration> 使用JavaScript腳本 發生在:反安裝、回滾。 |
AddIsapiCgiRestriction 添加ISAPI CGI約束 |
Only for IIS7 machines register ISAPI_RewriteProxy.dll as ISAPI extension in IIS metabase. 只用於IIS7的機器,在IIS管理元庫中將ISAPI_RewriteProxy.dl爲ISAPI擴展 IIS7管理元庫路徑: <configuration> <system.webServer> <security> <isapiCgiRestriction> <add path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" allowed="true" description="Helicon Proxy" /> </isapiCgiRestriction> </security> </system.webServer> </configuration> 使用JavaScript腳本 發生在:安裝。 |
DeleteIsapiCgiRestriction 刪除ISAPI CGI約束 |
只用於IIS7的機器,從IIS管理元庫中刪除用做ISAPI擴展的ISAPI_RewriteProxy.dll。 IIS7 管理元庫路徑: <configuration> <system.webServer> <security> <isapiCgiRestriction> <add path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" allowed="true" description="Helicon Proxy" /> </isapiCgiRestriction> </security> 使用JavaScript腳本 發生在:反安裝、回滾。 |
AddScriptMap 添加腳本映射 |
只用於IIS7的機器,在IIS管理元庫中將ISAPI_RewriteProxy.dll註冊爲ISAPI擴展用於處理*.rwhlp文件擴展名。 IIS7管理元庫路徑: <configuration> <system.webServer> <handlers> <add name="Helicon Proxy" path="*.rwhlp" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" resourceType="Unspecified"/> </handlers> </system.webServer> </configuration> 使用JavaScript腳本 發生在:安裝。 |
DeleteScriptMap 刪除腳本映射 |
只用於IIS7的機器,從IIS管理元庫裏去除用做ISAPI擴展以處理*.rwhlp文件擴展名的ISAPI_RewriteProxy.dll的註冊 IIS7管理元庫路徑: <configuration> <system.webServer> <handlers> <add name="Helicon Proxy" path="*.rwhlp" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" resourceType="Unspecified"/> </handlers> </system.webServer> </configuration> 使用JavaScript腳本 發生在:反安裝、回滾。 |
if (isset($_SERVER['HTTP_X_REWRITE_URL'])){$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];}後面跟有RewriteRule(或者RewriteProxy)指令的多重RewriteCond指令隻影響單個規則。若是一些條件須要被用於多個規則,必須重複寫這些條件指令以應用到每條規則上。
alnum | 全部的alpha數字字母 |
alpha | 字母表字符[a-zA-Z]。其它字符也能夠包含在內,這取決於本地環境 |
blank | 全部的空白字符,包含回車或者空格 |
cntrl | 全部的控制字符 |
digit | 從0到9的數字 |
graph | 全部的圖畫字符 |
lower | 全部的小寫字母[a-z],其它的字符也能夠包含在內,這取決於本地環境 |
全部的印刷字符 | |
punct | 全部的標點符號 |
space | 全部的空白佔位符 |
upper | 全部的大寫字母[A-Z],其它的字符也能夠包含在內,這取決於本地環境 |
xdigit | 全部的16進字字符0~9,A-F |
word | 全部的詞彙字符,包括字母數字外加underscore |
unicode | 全部的編碼大於255的字符,這隻對大範圍字符特徵類生效 |
這裏有一些縮寫法能夠代替以上字符類:
? \w 代替 [:word:]
? \s 代替 [:space:]
? \d 代替 [:digit:]
? \l 代替 [:lower:]
? \u 代替 [:upper:]
單個字符轉義序列
下面的轉義序列是單個字符的別名:
轉義序列 | 字符代碼 | 含義 |
\a | 0x07 | 信號鈴記號. |
\t | 0x09 | 製表符 |
\v | 0x0B | 垂直製表符 |
\e | 0x1B | ASCII轉義字符 |
\0dd | 0dd | 八進制字符代碼,其中dd是一個或多個八進制數字。 |
\xXX | 0xXX | 十六進制字符代碼,其中XX是一個或多個八進制數字。 |
\x{XX} | 0xXX | 十六進制字符代碼,其中XX是一個或更多十六進制數字,可選用Unicode字符。 |
\cZ | z-@ | ASCII轉義序列control-Z,其中Z是任意一個編碼大於或等於「@」的編碼的ASCII字符。 |
雜項轉義序列
如下提供perl的大部分兼容性,可是在\l、\L、\u和\U上有一些區別
轉義序列 | 含義 |
\w | 等價於 [[:word:]]. |
\W | 等價於[^[:word:]]. |
\s | 等價於[[:space:]]。 |
\S | 等價於[^[:space:]]。 |
\d | 等價於[[:digit:]]。 |
\D | 等價於[^[:digit:]]。 |
\l | 等價於[[:lower:]]。 |
\L | 等價於[^[:lower:]]。 |
\u | 等價於[[:upper:]]。 |
\U | 等價於[^[:upper:]]。 |
\C | 任何單個字符,等價於「.」 |
\X | 匹配任何Unicode組合字符序列,例如「a\x0301」(字符a和一個尖角) |
\Q | 開始引號運算符。後面跟前的全部的內容都被看成字面值,直到發現一個\E結束運算符。 |
\E | 結束引用運算符,終止一個由\Q開頭的引用序列。 |
怎樣獲得匹配
正則表達式將匹配第一個可匹配字符串。若是從給定的起始處能夠匹配到不止一個字符串,則它會匹配那個能匹配得最長的字符串。若是從同一個起始處有多個合適的匹配,並且每一個匹配的長度都同樣,則將選擇那個第一子表達式匹配得最長的匹配。若是有兩個以上的匹配字符串它們的第一子表達式匹配得同樣長,則比較第二子表達式匹配的長度,如此類推。注意:ISAPI_Rewrite使用比封演算法。只有表達式匹配了整個順序串才能獲得匹配結果。例如:
• RewriteCond URL ^/somedir/.* #將匹配任何導向somedir目錄以及它的子目錄的請求,與此同時,
• RewriteCond URL ^/somedir/ #只匹配somedir根目錄的請求。
對「病態」正則表達式的特別提示:
ISAPI_Rewrite 使用了一個很是強大的來自Boost庫的正則表達式引擎。可是它依然有一些侷限性:有着一些「病態」的表達式,它可能會指數級地消耗匹配時間。這些都涉及到嵌套重複運算符,例如試圖對N個連續字母a匹配表達式「(a*a)*b」,消耗的時間將與N2成正比。這些表達式經常能改爲另外一種寫法來避免這種問題。例如,「(a*a)*b」能夠被改寫成「a*b」,解析它消耗的時間與N成正比。在多數狀況下,非嵌套重複表達式消耗的時間與N2成正比,可是,若是條款是相互排斥的,則它們會在線性時間裏完成匹配。在「a*b」這種狀況下,每一個字符將要麼匹配a要麼匹配b或者不匹配。相較之下,「a*a」匹配器不能告知哪一個分支被採起(第一個 a仍是第二個a)所以必須嘗試兩種。
Regex能夠檢測出這種「病態」的正則表達式並終止和它們的匹配。這將使ISAPI_Rewrite的規則失效。當一個規則失效時,ISAPI_Rewrite將給客戶端發送一個"Internal Server error - Rule Failed"的狀態,以表示配置錯誤。
4.1AccessFileName指令
說明 | 設置分佈式配置文件的名稱 |
語法 | AccessFileName filename [filename] ... |
默認值 | AccessFileName .htaccess |
使用環境 | server config |
指定一個ISAPI_ReWrite尋求分佈式配置的文件名列表。默認文件名是.htaccess。ISAPI_ReWrite只能載入它能在這個列表中找到的第一個文件。默認狀況下ISAPI_ReWrite管理者會以hidden屬性標記配置文件-它將防止文件被遠程用戶直接訪問到。
若是配置文件進行了任何修改,它將在下次請求服務器時自動加載。
4.2AllowOverride指令
說明 | 明確規定了每一個目錄重寫的基準URL。 |
語法 | AllowOverride All|None|directive-type [directive-type] ... |
默認值 | AllowOverride All |
使用環境 | server config, virtual host, directory |
這個指令聲明瞭在分佈式.htaccess文件裏的指令是否能夠覆蓋父級別的httpd.conf中的指令。在ISAPI_Rewrite的使用環境中,這個指令實際上控制了特定虛擬主機或者目錄的.htaccess文件的可用或者不可用。目前只支持三個值:All、None和FileInfo。
All和FileInfo使.htaccess文件以及它裏面的整個ISAPI_Rewrite目錄可用,None使全部的.htaccess文件以及目錄不可用。這些目錄具備繼承性。這意味着若是你爲一些目錄或者虛擬主機指定AllowOverride none,.htaccess文件將對整個子目錄樹不可用。
4.4RewriteRule指令
說明 | 定義URL重寫規則 |
語法 | RewriteRule Pattern Substitution [flags] |
使用環境 | server config, virtual host, directory, .htaccess |
這個指令定義了單個URL重寫操做。它可能在一個配置文件中出現屢次,每一個實例定義一個重寫URL的規則。RewriteRule指令包含URL匹配模式、替換字符串以及可選的標誌設置。
Pattern(模式)是一個用來匹配當前URL的Perl兼容正則表達式。當前的URL能夠是原來請求的URL或者已經由優先級高的規則替改過的URL。網址從不包含協議或者主機名,從第一個斜槓字符開始(只對httpd.conf文件適用)。並且當前網址還因不一樣的應用配置級別而異。對於目錄級配置(.htaccess文件),結尾的斜線和配置文件的目錄名,會在匹配時被從URL中忽略掉。在建立正則表達式時,請閱讀這個文檔的正則表達式語法部分來獲得更多的信息。
"!"字符打頭的模式將否認整個表達式。否認模式不能產生子匹配,因此你不能使用$N的替代引用。
Substitution(替換)字符串指定了模式是匹配時生成URL的格式字符串。除了純文本,它能夠包括這些特殊字符。
• 對Rewrite模式的回溯引用 $N
• 對Rewrite模式的回溯引用 %N
• 服務器變量 %{VARNAME}
• 條件格式模式 ?Ntrue_string:false_string
• 分組括號「(」和「)」
替換字符串將全部的字符視爲字面值,除了$'、'\'、'('、')','?',':'和'\'。爲了字面化地讀出特殊字符,它定義了用"\"引導的轉義字符。下面的特殊字符是容許的。
$& | 輸出匹配的整個表達式。 |
$` | 輸出上一個的匹配結束到當前匹配的開始之間的文本(若是以前沒有找到匹配串,則輸出從開頭到當前匹配的開始之間的文本)。 |
$' | 輸出當前匹配以後跟着的全部文字。 |
$$ | 輸出字面值$ |
\a | 信號鈴字符 |
\f | 表單反饋字符 |
\n | 新行字符 |
\r | 回車符 |
\t | 製表符 |
\v | 垂直製表符 |
\x | 十六進制字符,好比說\x0D. |
\x{} | 一個可能的Unicode十六進制字符-例如\x{1A0} |
\cx | ASCII的轉義字符x,例如\c @等價於escape-@。 |
\e | The ASCII 轉義字符 |
\dd | 八進制字符常量,例如\10。 |
\l | 致使下一個字符被小寫輸出。 |
\u | 致使下一個字符被大寫輸出。 |
\L | 致使整個後繼字符串被小寫輸出,直到遇到\E。 |
\U | 致使整個後繼字符串被大寫輸出,直到遇到\E。 |
\E | 結束\L或者\U的後續字符串 |
\\ | 單個反斜槓字符'\' |
RewriteRule從父配置文件開始按照在配置文件中出現的次序應用。每一個規則只有在它的Pattern匹配了一個URL並且全部鏈接條件(RewriteCond)都匹配時纔會被應用。在該URL用Substitution完成替換以後,重寫過程還在繼續,一直到配置文件結束或者遇到一個用了任何中止標誌的規則。在Substitution中的特殊字符串"-"(短橫)意味着沒有替換,並且當你須要應用該規則並留下的原始的未被染指過的URL時它是頗有用的。
此外,這裏有一個支持的flag(標誌)列表。這些標識能夠改變規則的表現。與Apache徹底兼容的標誌被標記爲綠色,不支持的標誌被標記爲綠色,只在 ISAPI_Rewrite中被支持的標識被標記成黃色。
CU (Case Upper)
把替換字符串改爲大寫.
CL (Case Lower)
把替換字符串改爲小寫.
chain|C
將當前規則與後一條規則連接起來,後一條規則只有在當前規則被匹配的狀況下才能被執行。連接能夠再後續連接。
cookie|CO=NAME:VAL:domain[:lifetime[:path]]
設置一個有指定字段的cookies頭,並把它和當前請求的響應一塊兒發送到客戶端。
env|E=VAR:VAL
不支持,在UNIX環境中設置一個環境變量,在Windows系統中無心義。
forbidden|F
發送即時403 FORBIDDEN響應到客戶端,中止這個請求的規則處理以及全部其餘的替換處理。
gone|G
發送一個即時401Gone響應到客戶端,中止這個請求的規則處理以及全部其餘的替換過程。
handler|H=Content-handler
不支持,爲請求明確指定了處理處理。在IIS的世界中這是能夠經過重寫請求的文件擴展名來實現。可是沒有從Apache處理到IIS文件擴展名的直接轉換方法。
last|L
中止這裏的重寫處理,再也不應用當前配置文件中的其它規則。在這種狀況下,後代的.htaccess文件依然能被用到。
loop|LP
在一個循環中重複運行當前單個規則直到它的模式以及條件再也不被匹配了。循環次數被限定爲200省得陷入無限循環。
next|N
從當前配置文件開始處重複運行重寫處理。循環次數被限定爲200省得陷入無限循環。
nocase|NC
這個標記使Pattern大小寫不敏感。
noescape|NE
不轉義輸出。在ISAPI_Rewrite默認狀況下,在輸出中會把全部的非ANSI字符編碼爲十六進制數%xx。
nosubreq|NS
這個標識在ISAPI_Rewrite中與在Apache中含義不一樣。精確的轉換是不可能的,但這個標誌可能仍然是有用的。每當配置文件處理完成以後,URL被重寫了,ISAPI_Rewrite將啓動這個新的URL處理過程(與Apache相同)使它能夠應用到另外一個配置文件中。此標識意思是該規則只針對初始用戶的請求執行,不針對已被重寫過的請求執行,以防可能出現的循環。ISAPI_Rewrite限定循環重複次數爲10。
nounicode|NU
若是設置了NU標記,從Unicode轉換爲UTF - 8將不會發生。全部Unicode字符會保持它的%xx格式不變。
O (nOrmalize)
留着用於與ISAPI_Rewrite 2.x兼容。若是使用了RewriteCompatibility2,這個指令在處理以前將URL規範化。規範化包括移除一個URL編碼、錯誤字符,等等。同時URL的規範化將徹底移除它的查詢字符串。若是RewriteCompatibility2 沒有被使用,URL按照默認被規範化(就如同它在mod_rewrite中所作的),此標誌的含義將反轉。
proxy|P
將結果URL強制內部處理爲另外一臺服務器上的目標,並即時傳到遠程服務器上,而且,規則處理在這裏中斷了。遠程服務器的響應將被傳遞迴客戶端。proxy須要您指定完整的URL,由協議、主機名稱等開頭。ISAPI_Rewrite使用ISAPI擴展來處理代理請求。你能夠在代理配置章節中閱讀到更多有關於此的內 容。
passthrough|PT
不支持或者始終支持。在IIS中結果始終傳遞到下一個處理
qsappend|QSA
追加當前查找串的數據到替換串而不是由一個替換字符串取代它。當你須要在保留原來的參數再添加更多的查詢字符串參數時,可使用它。
redirect|R [=code]
強制服務器用重定向指令給客戶端發送一個即時響應,提供一個新的接替位置。能夠選加前綴http://thishost[:thissport]/從而把URL帶到一個可用的絕對形式。若是沒有給出代碼,將使用一個302響應(暫時性移動)。你能夠選擇在3XX系列範圍內指定任何代碼。
skip|S=num
若是當前的規則匹配,強制rewrite引擎跳事後面num個規則。
type|T=MIME-type
強制目標文件的MIME類型轉換成被設定的MIME類型。這可以被用來根據一些條件設置內容類型。
U (Unmangle log)
無損記錄。記錄它原來請求的網址,而不是被重寫的URL。
4.5RewriteCond指令
說明 | 爲如下的RewriteRule定義一個條件 |
語法 | RewriteCond TestString CondPattern |
使用環境 | server config, virtual host, directory, .htaccess |
該指令爲後面的RewriteRule,RewriteHeader或RewriteProxy指令規定了一個條件。一個規則指令前能夠有一個或多個條件,規則只有在全部條件獲得知足的狀況下才被應用。
TestString附加到純文本能夠包含下列結構。
• 用語法$N回溯引用RewriteRule模式
• 用語法%N回溯引用前面的RewriteCond模式
• 用語法${mapname:key|default}擴展RewriteMap
• 用語法%{HTTP:header}指代HTTP頭值
• 用語法%{NAME_OF_VARIABLE}指代服務器變量
如下是可用的服務器變量列表:
HTTP_USER_AGENT HTTP_REFERER HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_ACCEPT REMOTE_ADDR REMOTE_HOST REMOTE_PORT REMOTE_USER REMOTE_IDENT REQUEST_METHOD SCRIPT_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE |
DOCUMENT_ROOT SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE API_VERSION THE_REQUEST REQUEST_URI REQUEST_FILENAME HTTPS |
TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME 另外,全部的IIS特有的變量都是支持的。 |
CondPattern指定一個應用於TestString實例的正則表達式,如下特殊值也支持:
1.在正則表達式前頭加「!」符號指明否認模式。
2.'<CondPattern'將CondPattern做爲一個純字符串按字典順序比較,結果比較大
3.'>CondPattern'按字典順序比較,結果比較小
4.'=CondPattern'按字典順序比較,結果相等
5.'-d' 檢測字符串是否存在目錄。
6.'-f' 檢測字符串是否存在文件。
7.'-s' 檢測字符串是否是一個非零大小的文件。
8.'-l' (連接) 不支持的,始終爲false。
9.'-x' (擁有可執行權限) 不支持的,始終爲true。
10.'-F' (存在的文件,經過子請求) 不支持,和'–f'同樣。
11.'-U' (存在的URL,經過子請求) 不支持的,始終爲false。
下面的標記也是支持的:
'nocase|NC'
這個標記使模式大小寫不敏感。
'ornext|OR'
這個標記用邏輯或而不是隱含的邏輯與結合子請求RewriteCond指令。
O
留用於ISAPI_Rewrite 2.x的兼容性。在處理前規範化字符串。規範化包括移除一個URL編碼、錯誤字符,等等。同時URL的規範化將徹底移除它的查詢字符串。
4.6RewriteBase指令
說明 | 爲每一個目錄的重寫設置一個基準的URL |
語法 | RewriteBase URL-path |
默認值 | RewriteBase requested-directory-path |
使用環境 | directory, .htaccess |
當RewriteRule指令用於每一個目錄的配置文件(.htaccess)時,它將自動從路徑中剝去本地目錄前綴,只對剩下的部分應用規則。RewriteBase指令容許你爲這些規則精確指定一個基準。好比,哪部分要被剝離。
和Apache的mod_rewrite不一樣,ISAPI_Rewrite的訪問不只僅針對於物理路徑,同時還針對於虛擬路徑,並且能夠自動地選擇正確的基準。因此這個指令只是爲了兼容性緣由而被保留的。
URL-path能夠是相對於根的路徑也能夠是空,空的URL-path意味着規則的基準等同於網站的根目錄。
4.7RewriteProxy指令
說明 | 代理請求到一個遠程服務器 |
語法 | RewriteProxy Pattern Substitution [flags] |
使用環境 | server config, virtual host, directory, .htaccess |
使結果URL被內部處理爲另外一臺服務器上的目標,並即時傳遞到遠程服務器,今後中斷了規則處理。遠程服務器的響應將被傳遞迴客戶端。代理要求您指定完整的URL,由協議,主機名稱等開頭。ISAPI_Rewrite使用ISAPI擴展來處理代理請求。你能夠在配置代理的章節裏閱讀到更多。
語法和操做符與RewriteRule指令是相同的。可是RewroteProxy指令支持一些額外的標記。
H (preserve Host)
代理模塊在鏈接遠程服務器時將使用隨着源請求一塊兒發送過來的主機頭,若是沒有這個標誌代理服務器則將用主機名和遠程服務器的端口號組成主機頭。
A (Add authentication headers)
容許從代理服務器將一個認證信息傳遞到局域網服務器上,當客戶端認證和代理服務器衝突時它頗有用。服務模塊將對一個請求的服務器變量
AUTH_TYPE,AUTH_USER,LOGON_USER,REMOTE_USER
追加相應的頭
X-ISRW-Proxy-AUTH-TYPE,X-ISRW-Proxy-AUTH-USER,X-ISRW-Proxy-LOGON-USER,X-ISRW-Proxy-REMOTE-USER
到被代理的服務器。
CR (use Credentials)
代理模塊將嘗試用在URL中指定的證書身份驗證登陸遠程服務器,或者用基自己份驗證頭登陸遠程服務器。用了這個標誌,你能夠在一個替換字符串中使用http://user:password@host.com/page語法做爲一個URL。
4.8RewriteHeader指令
說明 | 重寫任何請求的HTTP頭 |
語法 | RewriteHeader HeaderName: Pattern Substitution [flags] |
使用環境 | server config, virtual host, directory, .htaccess |
這個RewriteHeader指令是RewriteRule指令中的一個很經常使用的變量。並且它被設計用來重寫客戶端的URL部分以及HTTP頭的部分。技術上的RewriteRule指令,至關於RewriteHeader的URL Pattern Substitution [flag]。這個指令可用於在IIS裏更多應用程序的處理以前重寫、建立或者刪除任何客戶端請求的HTTP頭。
HeaderName:指定將被重寫的HTTP頭的名字。
pattern、Substitution和flag與RewriteRule指令中都是相同的。
4.9RewriteMap指令
說明 | 爲一個映射函數值定義一個鍵 |
語法 | RewriteMap MapName MapType:MapSource |
使用環境 | server config, virtual host, directory, .htaccess |
RewriteMap指令被用來定義一個鍵到值的查找功能。當你須要映射大量的值時,它會頗有用的,並且它的速度遠遠快過用規則匹配來作到它。映射功能的性能受映射文件的大小影響微乎其微。有三種類型的映射:
• txt:用一個文本文件映射
• rnd:從多個可選項中產生隨機值
• int:內部函數
MapName是這個映射功能的名字,在RewriteRule命令中被用來指定這個映射。請確保每一個映射用惟一的名稱定義。你可使用如下語法在RewriteRule指令的Substitution參數中調用映射功能
${ MapName : LookupKey | DefaultValue }
若是這個結構是在Substitution中出現,ISAPI_Rewrite將在映射中查找這個鍵,萬一找到了一個,就用它的值替換這個結構。若是什麼值也沒有被找到,將用可選的DefaultValue。若是沒有指定DefaultValue,它將用一個空串替換。
下面的標誌也是支持的:
‘nocase|NC’
這個標誌使該查找鍵大小寫不敏感。
下面是一個大小寫不敏感映射文件指令的示例
RewriteMap examplemap txt:C:/path/to/file/map.txt [NC]
到MapSource文件的路徑,既能夠是絕對地址也能夠是相對地址。相對地址將被從當前配置的文件夾開始推算,換言之,就是從這個定義映射的配置文件的路徑開始推算。
而後你能夠在RewriteRule中以下使用這個映射:
RewriteRule ^/ex/(.*) ${examplemap:$1}
下列MapType和MapSource的組合是可用的:
txt:純文本映射,它的source是到一個可用的文本文檔的windows文件系統路徑。文本文檔必須是以下格式的:
#This is a commentkey1 value1 #Another commentkey2 value2keyN valueN
rnd:隨機查找多個值。Source是一個文本文檔的路徑,文本文檔必須是如下格式:
#This is a commentkey1 value1|value2|value3key2 value4|value5|value6|valueN
int: 調用內部函數。 Source必須是下列預約義的內部函數之一:
• toupper: 轉換關鍵詞爲大寫形式。
• tolower:轉換關鍵詞爲小寫形式。
• escape:把特定字符編碼爲十六進制。
• unescape:把十六進制值編譯爲特定字符。
4.10RewriteLog指令
說明 | 設置ISAPI_Rewrite日誌文件的名稱 |
語法 | RewriteLog file-path |
默認值 | RewriteLog installdir\rewrite.log |
使用環境 | server config |
這個指令用來設定記錄ISAPI_Rewrite動做的日誌文件的文件名。示例:
Rewritelog "C:\local\path\rewrite.log"
4.11RewriteLogLevel指令
說明 | 設置日誌級別 |
語法 | RewriteLogLevel Level |
默認值 | RewriteLogLevel 0 |
使用環境 | server config |
這個指令設置日誌的輸出長度。默認值0表示不記日誌,而最大的級別9則表示全部的動做都要記錄。
使用使用較高的級別值可能會下降ISAPI_Rewrite的操做速度。咱們建議你當你完成規則調試以後,經過設置日誌級別爲零來禁用日誌。
4.12RewriteOptions指令
說明 | 指定特殊選項 |
語法 | RewriteOptions Options |
使用環境 | server config, virtual host, directory, .htaccess |
這個指令能夠爲ISAPI_Rewrite設置特定選項。當前只有唯一一個選項可用:inherit。
inherit:強迫當前配置從父級繼承全部的選項和規則。這意味着來自父級配置的全部的規則將被再次執行,除非當前環境另有相應重寫規則。
4.13RewriteCompatibility2指令
說明 | 啓用或禁用ISAPI_Rewrite 2.x兼容模式 |
語法 | RewriteCompatibility2 on|off |
默認值 | RewriteCompatibility2 off |
使用環境 | server config, virtual host, directory, .htaccess |
這一指令將激活與ISAPI_Rewrite 2.x版的兼容性,將一些2.X的規則正確地翻譯爲3.0版本的語法。這並不意味着ISAPI_Rewrite 3將開始懂得不經修改舊的語法。若是您有針對ISAPI_Rewrite 2.X的舊設計請使用ISAPI_Rewrite提供的翻譯工具將這些舊規則轉化爲新的語法規則。
如今經過設置指令RewriteCompatibility2惟一改變的是,它將關閉網址常規前綴並刪除查詢字符串。 Apache的mod_rewrite將刪除匹配的URL的查詢字符串的這部分,相較之下ISAPI_Rewrite 2.X將匹配整個網址(包括查詢字符串在內),並且[O]標記的意思將由該指令倒置。
4.14ErrorLog指令
說明 | 通常的錯誤文件的位置 |
語法 | ErrorLog file-path |
默認值 | ErrorLog installdir\rewrite.log |
使用環境 | server config |
這個指令設置存放ISAPI_Rewrite總體錯誤和消息的日誌文件的名稱。例如httpd.conf file load, .htaccess file load,等等
例:ErrorLog "C:local\path\error.log"
4.15LogLevel指令
說明 | 設置通常的錯誤的日誌級別 |
語法 | LogLevel Level |
默認 | LogLevel warn |
使用環境 | server config |
這個指令設置通常日誌的輸出長度,跟它的重寫過程無關。這裏有一個level的可用值列表:emerg、alert、crit、error、warm、notice、info、debug。當前的ISAPI_Rewrite日誌只記錄錯誤信息。
設置LogLevel調試來解決配置文件中加載的問題。
4.16<VirtualHost>指令
說明 | 把應用於特定IP地或者主機的指令編組 |
語法 | <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> |
使用環境 | server config |
<VirtualHost> ... </VirtualHost>標籤用來對應用到特定虛擬主機裏的指令進行分組。
addr的可用值爲:
• 特定的IP地址
• 完整的域名
• 字符'*'能夠匹配任何主機或者特定服務器的任何端口號。
例如:
RewriteEngine offAllowOverride none<VirtualHost onesite.com www.onesite.com>RewriteEngine onAllowOverride all</VirtualHost>
不要忘了在每一個<VirtualHost>標籤中包含RewriteEngine on指令,也不要將不能應用的規則封裝進去。
4.17<Directory>指令
說明 | 將適用於特定的文件系統的目錄和子目錄的指令編組 |
語法 | <Directory directory-path> ... </Directory> |
使用環境 | server config, virtual host |
<Directory> ... </Directory>標籤被用來對應用到特定文件系統目錄以及子目錄的指令進行分組。通配符?和*是可用的。正則表達式也是可用的,須要以~字符打頭。
對目錄路徑參數必須當心:它們必須字面匹配用來訪問文件的文件系統路徑,用於某一特定<Directory>的指令並不適用於來自同一目錄下經過不一樣的路徑的文件訪問,例如經過不一樣的符號連接。只有完整的文件路徑是被容許使用的。
示例:
<Directory C:/inetpub/> AllowOverride None</Directory><Directory C:/inetpub/home/> AllowOverride FileInfo</Directory><Directory ~ "C:/inetpub/wwwroot/.*/[0-9]{3}"> # ... directives here ...</Directory>
不要忘了在每一個<Directory>標籤中包含RewriteEngine on指令,也不要將不能應用的規則封裝進去。
4.18<DirectoryMatch>指令
說明 | 將適用於特定的文件系統的目錄和子目錄的指令編組 |
語法 | <DirectoryMatch regex> ... </DirectoryMatch> |
使用環境 | server config, virtual host |
<DirectoryMatch> ... </DirectoryMatch> 被用來封裝一個只適用於指定的文件系統的目錄和子目錄的指令組。這個指令和<Directory ~> 語法相同。
示例:
<DirectoryMatch "^/www/(.+/)?[0-9]{3}"> # ... directives here ... </DirectoryMatch>
不要忘了在每一個< DirectoryMatch>標籤中包含 RewriteEngine on指令,也不要將不能應用的規則封裝進去。
4.19<Files> 指令
說明 | 將應用於匹配文件名的指令包裝起來 |
語法 | <Files filename> ... </Files> |
使用環境 | server config, virtual host, directory, .htaccess |
<File>指令以文件名限定了封裝的指令的做用域。filename參數必須包含一個文件名,支持?和*以及以~字符打頭的正則表達式。
示例:
<Files index.*> # ... directives here ... </Files><Files ~ "\.(gif|jpe?g|png)$"> # ... directives here ... </Files>
不要忘了在每一個<Files>標籤中包含RewriteEngine on指令,也不要將不能應用的規則封裝進去。
4.20<FilesMatch>指令
說明 | 將應用於匹配文件名的指令包裝起來 |
語法 | <FilesMatch regex> ... </FilesMatch> |
使用環境 | server config, virtual host, directory, .htaccess |
<FilesMatch>指令的語法和_指令"><Files ~>語法徹底同樣。
<FilesMatch "\.(gif|jpe?g|png)$">
不要忘了在每一個<FilesMatch>標籤中包含RewriteEngine on指令,也不要將不能應用的規則封裝進去。
4.21<Location>指令
說明 | 把被包裝起來的指令集應用到匹配的URL或者虛擬路徑 |
語法 | <Location URL-path|URL> ... </Location> |
使用環境 | server config, virtual host |
<Location> ... </Location>標籤用來將應用到特定URL或者虛擬路徑的指令分組。<Location>將運算符徹底從文件系統中分劃出來,所以那些指令將不會用來控制對文件文件系統位置的訪問。由於有幾個不一樣的URL可能映射到相同的文件系統位置。
該URL-path是一個形式爲「/path/」的虛擬路徑。沒有協議、主機名、端口號、查詢請求字符串被包含在內。URL-path能夠包含通配符?和*或者以~字符打頭的正則表達式。
示例:
<Location /directory> # ... rules go here</Location><Location /> # ... more rules go here</Location>
不要忘了在每一個<Location>標籤中包含RewriteEngine on指令,也不要將不須要用到的規則封套進去。
4.22<LocationMatch>指令
說明 | 把被包裝起來的指令集應用到正則表達式匹配的URL上 |
語法 | <LocationMatch regex> ... </LocationMatch> |
使用環境 | server config, virtual host |
這個指令的語法和指令"><Location ~>正則表達式語法徹底同樣。
示例:
<LocationMatch "/(home|section)/bin"> # ... rules go here</LocationMatch>
不要忘了在每一個<LocationMatch>標籤中包含RewriteEngine on指令,也不要將不能應用的規則封裝進去。
RewriteEngine onRewriteRule ^(.*?\.asp)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,LP,QSA]注意這個規則可能破壞頁面與CSS文件、圖片等的相對連接。至因此這樣是由於在瀏覽器中用於推算完整資源URI的基本路徑(頁面的父文件夾)發生了變化。只有在您使用目錄分隔符做爲替代字符時纔會發生這個問題。有三種可用的解決方案:
RewriteEngine onRewriteRule ^(.*?\.asp)~([^~]*)~([^~]*)(.*) $1$4?$2=$3 [NC,LP,QSA]富關鍵詞URLs
RewriteEngine onRewriteBase /RewriteRule ^products/[^?/]*_(\d+)\.asp /productpage.asp?productID=$1 [QSA]
另外一個更復雜的解決方案是建立一對一的映射文件,並用它來映射「our_super_tool」到127。該解決方案對一些有不少參數的長URL來講頗有用,並容許你隱藏數字標識符。這URL看起來像是http://www.mysite.com/products/our_super_tool.asp。請注意「our_supper_tool」部分必須是產品的惟一標識,是它的標識符。下面是這種解決方案的一個示例:
RewriteEngine onRewriteBase /RewriteMap mapfile txt:mapfile.txtRewriteRule ^products/([^?/]+)\.asp /productpage.asp?productID=${mapfile:$1}
並且你必需建立包含如下內容的mapfile.txt映射文件:
one_product 1another_product 2our_super_tool 127more_products 335
這種方法的優勢是:你可使用它來組合十分複雜的URL轉換,可是這是一個小例子,是這個指南中的題外之話。
使用IIS做爲反向代理 假設你有運行IIS的互聯網服務器以及幾臺後臺服務器或者應用程序運行在其它平臺或者機器上。這些服務器不能直接在互聯網上閱覽,可是你必須爲他人提供訪問這些服務器的渠道。這裏有一個演示如何簡單地將某個網站的完整內容映射到另外一個運行了ISAPI_Rewrite的站點的文件夾的示例:
RewriteEngine onRewriteBase / RewriteRule mappoint(.+) http://sitedomain$1 [NC,P]
藏匿文件擴展名: 雖然不可能將一個站點的全部的文件的擴展名都藏匿起來,可是咱們可使用ISAPI_Rewrite的文件檢查功能來隱藏某些已知擴展名。這裏有一個藏匿網站上.asp文件擴展名的規則示例:
RewriteEngine on#Redirect extension requests to avoid duplicate contentRewriteRule ^([^?]+)\.asp$ $1 [NC,R=301,L]#Internally add extensions to requestRewriteCond %{REQUEST_FILENAME}.asp -f RewriteRule (.*) $1.asp
仿真基於主機頭的虛擬網站 例如你已經註冊了兩個域名www.site1.com和www.site2.com。如今你可使用同一個物理站建立兩個不一樣的站點了。這裏是一個規則示例:
RewriteEngine on#Fix missing trailing slash char on foldersRewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]#Emulate site1RewriteCond %{HTTP:Host} ^(?:www\.)?site1\.com$RewriteRule (.*) /site1$1 [NC,L,NS]#Emulate site2RewriteCond %{HTTP:Host} ^(?:www\.)?site2\.com$RewriteRule (.*) /site2$1 [NC,L,NS]
如今只要把你的站點分別放到/site1和/site2目錄下就能夠了。注意www.site1.com和www.site2.com這兩個域名必須在IIS中被映射到這個網站裏,從而使ISAPI_Rewrite能攔截到請求。
或者,你可使用更多通用的規則,從而把任何請求都映射到與請求主機名同名的文件夾裏。
RewriteEngine on#Fix missing trailing slash char on foldersRewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]#Map requests to the foldersRewriteCond %{HTTP:Host} ^(www\.)?(.+)RewriteRule (.*) /%2$1 [NS]
網站的目錄名應該是這樣子的:/somesite1.com,/somesite2.info,等等。
阻斷內聯圖像(阻止盜鏈) 假如你有一些頁面插入了http://www.mysite.com/下的gif圖片。一些其它站點將經過網頁超連接插入這些圖片。這會給你的網站增長不少無用的通信量,並且你但願阻止這種作法。
雖然用ISAPI_Rewrite不能100%地保護圖片不被盜鏈(只有專門的反盜鏈產品才能作到它),你至少能夠在瀏覽器發來HTTP引用頭的時候限制這種狀況。下面的規則可讓你只容許來自同一主機的引用頁或者空地址訪問到這些圖片。
RewriteEngine onRewriteCond %{HTTP:Host}#%{HTTP:Referer} ^([^#]+)#(?!http://\1).+RewriteRule .*\.(?:gif|jpg|png) /block.gif [NC]
重定向非www的版本到www
若是你的網站同時能夠經過兩種形式的URL好比說http://helicontech.com和http://www.helicontech.com來訪問到,那麼最好將一種地址重定向到另外一種地址裏,來避免搜索引擎對重複內容作出的處罰。下面是一個能將全部的非www地址重定向到相應的www地址上去的301重定向規則。
RewriteEngine onRewriteCond %{HTTPS} (on)?RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]RewriteCond %{REQUEST_URI} (.+)RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]
強制SSL或者非SSL到一個指定的位置
這裏是一個演示如何將SSL強制轉到指定的文件夾的示例。只要簡單地把下面的規則放到該文件夾下的.htaccess文件裏就能夠了。
RewriteEngine on#Fix missing trailing slash char on foldersRewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]#Redirect non-HTTPS to HTTPSRewriteCond %{HTTP:Host} (.*)RewriteCond %{HTTPS} offRewriteCond %{REQUEST_URI} (.*)RewriteRule .? https://%1%2 [R,L]
而這個示例做用正好相反:將非SSL強制轉到指定文件夾。
RewriteEngine on#Fix missing trailing slash char on foldersRewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]#Redirect HTTPS to non-HTTPSRewriteCond %{HTTP:Host} (.*)RewriteCond %{HTTPS} onRewriteCond %{REQUEST_URI} (.*)RewriteRule .? http://%1%2 [R,L]
轉移站點位置
當你把網站從一個域名移到另外一個域名,或者從一個文件夾移動另外一個文件夾裏的時候,這是常常會遇到的問題。你但願將一個網站的全部請求重定向到另外一個網站裏,並且不丟失請求資源名以及參數。當你但願保留現有的網頁的排名和外連接的時候,它是很是有用的。這個解決方案是在舊的網站服務器上使用ISAPI_Rewrite:
RewriteEngine on#Permanent redirect to update old linksRewriteRule (.+) http://newserver.com$1 [R=301,L]
平衡負荷仿真
這個示例模擬某種DNS輪換負荷平衡技術。假設你有主站www.mysite.com和數臺web服務器分別註冊爲www[1-9].mysite.com。若是你在主服務器上安裝了ISAPI_Rewrite,你能夠將初始的客戶端請求重定向到幾臺特定服務器,從而在幾臺服務器之間隨機攤開通信量。一旦已重定向,客戶端將一直使用這一臺服務器。雖然這種解決方案並不很是理想,可是它確實能分攤你的通信量並避免在維護會話狀態方面發生的問題。
使用下面的規則來重定向客戶端:
RewriteEngine onRewriteMap hosts rnd:hosts.txtRewriteCond %{HTTP:Host} (www)\.mysite.com [NC]RewriteRule (.*) http://${hosts:%1}.mysite.com$1 [R,L]
下面是hosts.txt文件的內容
www www1|www2|www3|www4|www5|www6|www7|www8|www9
你還能夠在Apeche文檔裏找到不少其它有用的例子。它們多數不須要修改就能夠在ISAPI_Rewrite3裏使用。
RewriteLogLevel 9LogLevel debug它將建立error.log和rewrite.log兩個日誌文件,默認放在安裝目錄下。若是日誌文件被建立了,它代表ISAPI_Rewrite正在運行。閱讀做爲結果的error.log和rewrite.log文件,將能告訴你一些問題的根源線索。
ISAPI_Rewrite 發佈歷史
發佈 3.1.0.67
================
[篩選器功能] 加強映射文件的動態加載
[代理幫助文件錯誤]若是後端不設置內容長度頭的話,並不會返回全部的響應。
發佈 3.1.0.66
================
精簡版的限制
ISAPI_Rewrite的精簡版擁有相同的引擎和重寫功能。可是也有下面這些限制:
? 不支持分佈式.htaccess配置、目錄以及網站級配置,只有一個精簡版安裝目錄中的全局的httpd.conf配置能被載入。
? 不支持<VirtualHost>、<Directory>、<DirectoryMatch>、<Files>、<FilesMatch>、<Location> 以及<LocationMatch>這幾個標籤。
? 精簡版中沒有代理服務模塊,於是全部的和代理服務功能相關的好比說RewriteProxy指令以及[P]標記都會被忽略。
? 精簡版沒有針對於虛擬主機環境的手工安裝包
ISAPI_Rewrite精簡版徹底免費,它對開發或者測試目的以及只有幾個網站並且不須要分佈式配置或者代理功能的小型服務器來講是一個很好的解決方案
技術信息 ISAPI_Rewrite由四個部分組成:ISAPI篩選器、ISAPI擴展幫助、GUI管理器以及MMC嵌入式管理單元擴展。ISAPI_Rewrite篩選器和擴展都是用純C++語言寫的快速DLL模塊。當安裝ISAPI_Rwrite的時候, MMC嵌入式管理單元會被自動註冊。ISAPI篩選器將安裝在一個全局級別上,你不須要手工註冊它。ISAPI擴展也會被安裝並註冊。
ISAPI_Rewrite管理器實用工具能夠在沒有安裝MMC的系統中運行ISAPI_Rewrite MMC嵌入式管理單元。
Windows Vista以及Windows Server 2008系統中的ISAPI_Rewrite管理器實用工具(Helicon Manager.exe)要求管理員權限來執行,由於較小權限的用戶沒有權力讀取IIS管理元庫,而它對顯示網站配置來講是必需的。若是用受限的賬號運行ISAPI_Rewrite管理器,你會獲得登陸管理員賬號的自動提示。
ISAPI_Rewrite篩選器已經有足夠地快,所以不用擔憂它的性能。除非你的服務器運行在最大負荷之下。用戶在響應時間或者CPU負荷方面幾乎不能發現什麼區別,可是若是用了不少的規則的話,服務器最大帶寬可能掉下一點來。因此請注意你用的配置決定了性能。建議每一個網站使用的規則不要超過100條。在多數狀況下,能夠利用RewriteMap來避免使用大量的規則。
該程序使用了Regex++ 庫。
Regex++ (Version Boost 1.31)
Copyright ?1998-2004, Dr John Maddock
使用和傳播許可該使用許可覆蓋了全部的現有版本的ISAPI_Rewite,包括ISAPI_Rewrite、ISAPI_Rewrite徹底版、ISAPI_Rewrite精簡版、ISAPI_Rewrite測試版,後面統稱爲ISAPI_Rewrite除非另有指明。1.全部未明確授予的權利均由Helicon Tech保留。2.全部的關於ISAPI_Rewrite的版權都由它的做者Helicon Tech獨家保留。3. Helicon Tech准予無償使用ISAPI_Rewrite精簡版產品。4. Helicon Tech准予免費試用ISAPI_Rewrite產品30天,當試用期結束時,請要麼購買ISAPI_Rewrite,要麼刪除ISAPI_Rewrite產品。5.未註冊過的ISAPI_Rewrite試用版,能夠在不被改動的前提下自由傳播,除非有下例狀況。任何我的或者公司都不用爲在未得版權持有人書面許可的狀況下傳播ISAPI_Rewrite而付費。未經版權持有者的書面許可,未註冊的試用版ISAPI_Rewrite不容許捆綁其它安裝包。6. ISAPI_Rewrite必須被原樣傳播,不提供任何形式的保證實示或暗示。你能夠在你本身的磁盤上使用ISAPI_Rewrite。做者不爲由於濫用本軟件致使的數據丟失、損壞,或任何其餘類型的損失承擔責任。7.你不得使用、複製、模仿、克隆、出租、出售、修改、反編譯、反彙編以及其它任何反向工程,或者轉讓許可程序,或者任何許可程序的一個子集,除非本協議有提供。任何未經受權的使用將致使本許可自動終止。並可能致使刑事或民事起訴。8.本許可協議的條款是在將來版本的ISAPI_Rewrite將會有所變化。9.當你購買ISAPI_Rewrite時,將發給你「註冊碼」。這種「註冊碼」能夠我的或者公司購買,並只在一臺計算機上使用。若是您購買一個以上的ISAPI_Rewrite副本,發給大家的「註冊碼」只能在等於你購買的許可證數的計算機上使用。10.您只能使用來自Helicom Tech以及與Helicom Tech有業務合做或者技術合做的公司的註冊碼。11. 安裝和使用ISAPI_Rewrite意味着接受這些條款及許可條件。12. 若是您不一樣意本許可證的條款或違反本許可與您當地的法律規定,您必須從您的存儲設備中刪除ISAPI_Rewrite文件,並中止使用該產品。13.咱們堅持嚴格的隱私的準則,不會收集我的識別信息,除非是自願提供的。若是您有進一步的問題或意見,請訪問咱們的http://www.helicontech.com。感謝你使用ISAPI_Rewrite。Helicon Tech Corporation.