ISAPI_Rewrite是一個功能強大的網址操縱發(fā)動機的基礎上正則表達式。它的行為是像Apache的mod_Rewrite ,但專為微軟的Internet信息服務( IIS ) 。 ISAPI_Rewrite是一個ISAPI篩選器的書面純的C / C + +所以速度極快。 ISAPI_Rewrite讓您的自由,超出標準網址計劃和發(fā)展自己的計劃。
第一章:軟件介紹
ISAPI_Rewrite 是一款適用于IIS的功能強大的基于正則表達式的URL處理模塊。它兼容Apache的mod_rewrite的語法,從而使僅僅復制.htaccess文件就把配置從appach移植到IIS中或者從IIS移值到appach中變成可能。請參閱3.2兼容性圖表這一節(jié)。
ISAPI_Rewrite最重要的功能:
? ISAPI_Rewrite提供了和Apach mod_rewrite相同的句法和行為,使僅僅拷貝.htaccess文件就完成配置移植成為功能。(要想閱讀更多關于與mod_rewrite的兼容性,請參閱3.2兼容性圖表這一節(jié)。)
? 正則表達式支持靈活而強大的配置。
? 極速而且容易升級的純C++代碼。
? 真正的分布式配置:實時監(jiān)控服務器全局級別、虛擬主機(網站)級別、目錄級別的.htaccess文件。
? 隔離性:用戶級配置只影響本地用戶環(huán)境,從而使ISAPI_Rewrite成為Web主機提供商的理想解決方案。
重要的應用示例:
? 搜索引擎優(yōu)化。
? 一臺Web服務器的代理內容經過另一臺web服務器。
? 防止內容被吸血(盜鏈)。
? 阻斷特定主機、反向鏈接或者煩人的搜索機器人。
? 內容商議:向不同的語言用戶或者不同的瀏覽器用戶提供不同的文件。示例
? 為群集式服務器架構模擬負載均衡。
定價資料
? 45天的試用期
? 單機版99美元
? ISAPI_Rewrite精簡版是免費的。在這里可以看到受限的細節(jié)說明。
? 大宗采購可議折扣。
2.1系統(tǒng)要求
ISAPI_Rewrite可以被安裝在下列操作系統(tǒng)中:
? 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之前,操作系統(tǒng)中必須先安裝IIS。
32位和64位的Windows版本都是支持的,但是你必須下載32位版和64位版兩種不同的安裝包。Windows Installer 2.0必須運行安裝程序。你可以從微軟的網站上下載到最新版本的Windows Installer。
在Windows Vista和Windows Server 2008上安裝ISAPI_Rewrite,還必須先安裝下面兩個模塊(默認情況下這兩個模塊是不安裝的)
? ISAPI過濾器
? ISAPI 擴展
2.2安裝程序
在運行安裝包之前請先閱讀系統(tǒng)要求部分。下載并安裝某個版本的ISAPI_Rewrite.msi,依照安裝向導的說明操作。安裝過程是自動的,并有自我描述。ISAPI_Rewrite在自動安裝過程中必須重啟IIS。下列服務必須被重啟:IISADMIN、W3SVC。不需要手工把任何ISAPI篩選器或者擴展加入到網站或者全局列表中。它能夠在安裝和配置過程中自動完成。
命令行安裝
ISAPI_Rewrite也能夠通過命令行進行后臺安裝。請使用以下命令行語法來安裝:
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系統(tǒng)中注冊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組件:萬維網服務、應用程序開發(fā)功能、ISAPI篩選器。
如果你需要代理服務器功能,你還需要將ISAPI_RewriteProxy.dll注冊為ISAPI擴展來侍服文件擴展名“*. rwhlp”。在不同的IIS版本中要求不同的操作。請參閱你管理的IIS版本的文檔來了解如何注冊一個新的ISAPI擴展并把它映射到IIS系統(tǒng)的文件擴展名上。在Windows Vista和windows server 2008首先必須安裝可選的IIS組件:萬組網服務、應用程序開發(fā)功能、ISAPI篩選器。使用短路徑名(8.3模式)作為ISAPI_RewriteProxy.dll的模塊路徑,如果路徑里有一個空格字符,IIS載入這個模塊時將失敗。
把httpd.conf文件放在ISAPI_Rewrite.dll文件的同一目錄下并編輯它。
把下列兩行內容放到httpd.conf文件中以注冊ISAPI_Rewrite 產品:
RegistrationName=Your registration name RegistrationCode=REG-CODE-PROVIDED-FROM-HELICON
依照“運行ISAPI_Rewrite的權限需求”這一部分的說明來檢查文件系統(tǒng)權限。
2.4反安裝
反安裝程序會刪除所有安裝程序所生成的文件、從管理元庫中注銷篩選器,并刪除所有由安裝程序所添加的其它管理元庫變化。如果用戶決定在反安裝過程中保留用戶文件的話,下列用戶數據文件在反安裝后會被留下來。
文件名 | 說明 |
Program Files/Helicon/ISAPI_Rewrite/httpd.conf | 用戶規(guī)則的主配置文件 |
Program Files/Helicon/ISAPI_Rewrite/error.log | 包含錯誤日志的文件 |
Program Files/Helicon/ISAPI_Rewrite/rewrite.log | 包含重寫日志的文件 |
.htaccess (various folders) | 用戶創(chuàng)建的含有規(guī)則的配置文件 |
“刪除用戶創(chuàng)建的文件”的選項在將反安裝過程中提供給用戶。如果啟用這個選項則卸載程序也將刪除位于Program Files文件夾里用戶創(chuàng)建的文件。 .htaccess文件不會被刪除。
要用命令行后臺卸載ISAPI_Rewrite,請使用下面的語法:
msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes
2.5運行ISAPI_Rewrite所需的權限
在一個干凈的默認Windows系統(tǒng)上自動安裝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將不能加載并監(jiān)視它。
請稍留意ISAPI_Rewrite安裝目錄上的任何一點拒絕權限設置,因為在Windows 操作系統(tǒng)中,拒絕權限優(yōu)先于任何允許權限記錄。
在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應用程序的屬性中給予一個“純腳本”的執(zhí)行權限。
2.6MSI的自定義行為自定義行為
自定義行為 | 說明 |
WiseAltStartup 自動智能啟動 |
為運行在延時模式中的自定義行為保存屬性的當前狀態(tài)。 使用一個可執(zhí)行文件(dll) 發(fā)生在:安裝、反安裝。 |
WiseCleanup 智能清理 |
這個行為被調用來清理上一個自定義行為所遺留下的臨時文件 使用一個可執(zhí)行文件(dll) 發(fā)生在:安裝、反安裝。 |
WiseStartup 智能啟動 |
這個行為使調用一個.dll文件或者提取必要Wisescript.exe文件和.dll文件的行為可以傳遞參數。 使用一個可執(zhí)行文件(dll) 發(fā)生在: 安裝、反安裝 |
WiseUpgradeCheck 智能可選擇地升級 |
這個行為被調用來解決當Windows安裝程序運行時不檢測應用程序的早期版本的問題。 使用一個可執(zhí)行文件(dll) 發(fā)生在:安裝。 |
WiseUpgradeCheckEx 智能預選升級 |
添加這個行為用來解決當Windows安裝程序運行時不檢測應用程序的早期版本的問題。 使用一個可執(zhí)行文件(dll) 發(fā)生在:安裝。 |
WiseGetIISVersion 智能獲得IIS版本 |
對主要的IIS版本設置屬性(IISVERSION). 使用一個可執(zhí)行文件(dll) 發(fā)生在:安裝。 |
RegisterFilterInMetabase 在管理元庫中注冊篩選器 |
這個行為添加一個命名為ISAPI_Rewrite3的全局ISAPI篩選器到IIS管理元庫里 IIS5, IIS6 管理元庫: IIS:/LM/W3SVC/Filters/ add key ISAPI_Rewrite3 IIS:/LM/W3SVC/Filters/FilterLoadOrder append "ISAPI_Rewrite3" 使用一個可執(zhí)行文件(dll) 發(fā)生在:安裝。 |
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" 使用一個可執(zhí)行文件(dll) 發(fā)生在:反安裝、回滾。 |
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"條目; 使用一個可執(zhí)行文件(dll) 發(fā)生在:安裝。 |
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"條目; 使用一個可執(zhí)行文件(dll) 發(fā)生在:反安裝、回滾。 |
RegisterExtensionInScriptMap 在腳本映射中注冊擴展 |
在IIS管理員庫中將ISAPI_RewriteProxy.dl注冊為ISAPI擴展來處理*.rwhlp文件擴展名 IIS5,IIS6管理元庫: IIS://LM/W3SVC/ 使用一個可執(zhí)行文件(dll) 發(fā)生在:安裝。 |
RemoveExtensionFromScriptMap 從腳本映射中刪除擴展 |
從IIS管理元庫中移除作為ISAPI擴展、用于處理*.rwhlp文件擴展名的ISAPI_Rewrite.dll的注冊信息 IIS5, IIS6管理元庫: IIS://LM/W3SVC/ 使用一個可執(zhí)行文件(dll) 發(fā)生在:反安裝、回滾。 |
GetServisesStatus 獲得服務狀態(tài) |
保存IISADMIN、W2WC、NNTP、SMTP 和FTP 服務的當前狀態(tài) 創(chuàng)建msi屬性: [SERVICES_STATUS] 使用一個可執(zhí)行文件(dll) 發(fā)生在: 安裝、反安裝。 |
StartServicesEx 按預設開啟服務 |
根據狀態(tài)預設來啟動ISADMIN、W2WC、NNTP、 SMTP 和 FTP 服務 使用msi 屬性: [SERVICES_STATUS] 使用一個可執(zhí)行文件(dll) 發(fā)生在: 安裝、反安裝。 |
SaveProductID 保存產品ID |
如果要注冊產品的話,保存REGISTRATIONNAME和REGISTRATIONCODE的屬性值 使用msi 屬性: [REGISTRATIONNAME] , [REGISTRATIONCODE]; 使用文件: [INSTALLDIR]\ISAPI_Rewrite3\httpd.conf 使用一個可執(zhí)行文件(dll) 發(fā)生在: 安裝。 |
Check32bitMode 檢測32位模式 |
在64位系統(tǒng)中檢查32位IIS兼容模式是否可用,從而安裝正確的ISAPI篩選器版本。IIS6, IIS7 使用管理元庫路徑: IIS://LM/W3SVC/AppPools property Enable32bitAppOnWin64; 使用msi 屬性:[ENABLE32BITAPPONWIN64] 檢查一個32位的應用程序是否能運行在一臺安裝了64位版本的windows的電腦上。 使用javascript腳本 發(fā)生在: 安裝。 |
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腳本 發(fā)生在: 安裝。 |
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腳本 發(fā)生在:安裝。 |
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腳本 發(fā)生在:反安裝、回滾。 |
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腳本 發(fā)生在:安裝。 |
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腳本 發(fā)生在:反安裝、回滾。 |
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腳本 發(fā)生在:安裝。 |
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腳本 發(fā)生在:反安裝、回滾。 |
3.1基本概念
URL數據處理是用一個文本配置文件來定制的,內含各種指令設置。配置分幾種等級。首先是全局(服務器范圍的)配置指令,放置在ISAPI_Rewrite安裝目錄里的一個名為httpd.conf的文件里。那里還有若干個標簽可以封裝應用到特殊位置的指令:<VirtualHost>、<Directory>、<DirectoryMatch>、<Files>、 <FilesMatch>、<Location>以及<LocationMatch>。最后ISAPI_Rewrite支持可以放在任何網站目錄里的.htaccess文件,那些文件中的規(guī)則可以應用到該位置以及它的子目錄中。所有的配置文件在每次修改文件后都會被自動重載。允許用第三方程序和腳本來修改文件。
在很多情況下ISAPI_Rewrite是用來重寫URL的。除了重寫之外,ISAPI_REWRITE能夠修改、生成、刪除任何其它客戶端Request中的HTTP頭。模塊操作可以載入改寫、代理、重定向或者阻斷原始客戶端到服務器的請求。
Rewriting可能使服務器在得到了一個客戶端的源請求時用一個新的URL繼續(xù)請求處理。新的URL可以包括查詢串部分(跟在問號后面),也可以指向任何一個完全的靜態(tài)文件或者腳本(例如asp)、或者程序(例如.exe),等等。對用戶和網站配置來說重寫是徹底透明的。因為它Web應用程序收到請求之前在服務器內部執(zhí)行。
Proxying使URL經過內部處理后指向另一臺服務器,并很快傳遞到遠程服務器上(換言之,規(guī)則處理在這里中止了)。遠程服務器的響應很快被傳回客戶端。代理服務器要求你指定完整的有效URL,以協議、包括主機名開頭等等。ISAPI_Rewrite使用ISAPI擴展來處理代理請求,你可以在“代理服務器配置”這一章里讀到更多信息。
Redirection將發(fā)送一個帶有重定向指令的即時響應(HTTP響應碼為302或者說301),將網址設置為一個新的位置。您可以在重定向指令里使用絕對URL格式(這是RFC2616所要求的)將請求重定向到不同的主機、端口和協議。如果此信息被忽略, ISAPI_Rewrite將自動照當前的協議、服務器名稱和目錄位置提供URL。重定向指令總是導致重寫引擎中止處理后面的規(guī)則序列。
每個規(guī)則按它在配置文件中出現的順序來應用。目錄級配置文件從父路徑開始一個接一個地處理,來自于全局配置文件的規(guī)則最先適用。
在修改URL之前ISAPI_Rewrite會保存原URL到Http頭,命名為X-Rewrite-URL。然后它能夠在腳本中作為HTTP_X_REWRITE_URL服務器變量取回。因為在IIS里,系統(tǒng)變量名不能被修改,所以ISAPI_Rewrite不能提供與Apache兼容的變量名REQUEST_URI。如果你的應用程序的設計要依賴于REQUEST_URI變量,你必須修改它,用HTTP_X_REWRITE_URL變量來代替。下面是一個PHP代碼補丁的示例:
if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL']; }后面跟有RewriteRule(或者RewriteProxy)指令的多重RewriteCond指令只影響單個規(guī)則。如果一些條件需要被用于多個規(guī)則,必須重復寫這些條件指令以應用到每條規(guī)則上。
3.2和Apache下mod_rewrite的兼容性
這里有一個完整的ISAPI_Rewrite和mod_rewrite兼容性圖表。標記為綠色的功能或指令是充分支持的,黃色的功能是部分支持或計劃在下一版本中支持,標示為紅色的功能是不支持的。
· 兼容Perl的正則表達式 (plus extended syntax)
· 服務器級httpd.conf配置
· 虛擬網站.htaccess配置文件
· 目錄.htaccess配置文件
· <VirtualHost>
· <Directory>
· <DirectoryMatch>
· <Files>
· <FilesMatch>
· <Location>
· <LocationMatch>
· AccessFileName
· RewriteEngine
· RewriteRule
o $N 規(guī)則后向引用
o %N RewriteCond 后向引用
o ${mapname:key|default}
o %{VARNAME} 服務器變量
o '!' 取非
o [C] 與下一個規(guī)則聯鎖
o [CO=name:val:domain:lifetime:path] 設置cookie
o [E=var:val] 設置環(huán)境變量
o [F] 強制禁止應答
o [G] 強制繼續(xù)應答
o [H=content-handler] 明確的內容處理 (不適用)
o [L] 上一個規(guī)則標記
o [N] 再次應用規(guī)則
o [NC] 大小寫不敏感
o [NE] 不轉義輸出
o [NS]非內部子請求
o [P]代理通過
o [PT] 傳遞通過下一個處理程序 (一直開啟)
o [QSA] 追加查詢字符串
o [R =code] 重定向
o [S=num] 跳到下面第 n條規(guī)則
o [T=MIME-type] 強制明確應答 MIME 類型
· RewriteCond
o [NC] 大小寫不敏感
o [OR] 邏輯并集
o %{HTTP:header}
o '!' 非
o '<CondPattern' 大于比較符
o '>CondPattern' 小于比較符
o '=CondPattern' 等于比較符
o '-d' 目錄存在
o '-f' 文件存在
o '-s' 非零文件
o '-l' 符號鏈接
o '-x' 有可執(zhí)行權限的文件
o '-F' 通過子請求文件存在
o '-U' 通過子請求URL存在
· RewriteBase
· RewriteMap
o txt: 文本映射
o rnd: 隨機映射
o int: 內部函數 toupper, tolower, escape, unescape
o prg: 外部程序
o dbm: 散列文件
· RewriteLog
· RewriteLogLevel
· RewriteOptions
· RewriteLock
· AllowOverride
以下是這個程序文檔中要被用到的使用環(huán)境的詳解:
server config
這個標志表示該指令可以用在全局httpd.conf配置文件中,但是不能用在任何一個分區(qū)(例如<Virtualhost>或者<Directory>)內部。它不允許放在.htaccess文件中。
vitrual host
這意味著指令可以出現在<VirtualHost>容器內。
directory
這個標志表示指令在<Diretory>、<Location>、<Files>容器內可用,而且它們的正則表達式是等價的。
.htaccess
使用環(huán)境標為它的指令可以出現在每個目錄的.htaccess文件中。記住當RewriteRule指令用在.htaccess配置文件中時,它將自動從路徑中剝去本地目錄前綴,只對剩下的部分應用規(guī)則。你可以使用RewriteBase指令顯式地給這些規(guī)則指定一個基本路徑。
應用次序
當同一分區(qū)內的多條指令同時適用時,理解每個分區(qū)應用的次序是很重要的,因為它會對最終效果起作用。應用次序如下所述:
1.<Directory>(正則表達式除外):多個<Directory>分區(qū)可以應用于單個請求,如果多個(非正則表達式)<Directory>分區(qū)匹配了包含文檔的這個目錄(或者它的上級目錄中的一個),則按照從短到長的匹配次序應用指令。
2..htaccess文件按父目錄到子目錄的順序應用。
3.<Files>和<FileMatch>同時被執(zhí)行。
4.<Location>和<LocationMatch>也同時被執(zhí)行。
先應用虛擬主機外面定義的相應分區(qū)和指令,再應用<VirtualHost>分區(qū)中的分區(qū)和指令。同一時間只有一個<VirtualHost>分區(qū)可以應用給請求。較晚的分區(qū)優(yōu)先于較早的那些。
3.4正則表達式
正則表達式語法指南是Rege++文檔的一部分,由John Maddock博士友情提供,Copyright ?1998-2004,包含在《Boost license》這本書里。完整的語法說明可以在《Boost.Regex documentation》中找到。
字面值
所的字符都是字面值,除了“.”“*”“?”“+”“(”“)”“{”“}”“[”“]”“^”和“$”。當這些字符由“\”前導時也是字面值。一個字面值是個匹配它自己的字符。
通配符
點字符“.”匹配空字符和換行符以外的任何單個字符。
重復
重復是被重復任意次數的表達式。一個表達式跟著“*”可以被重復任意次數,包括重復零次。一個表達式跟著“+”可以被重復任意次數,但是至少重復一次。一個表達式跟著“?”可以被只重復零次或者一次。當需要明確指定重復的最低次數和最高次數時,可以用限定運算符“{}”。這樣“a{2}”是字母“a”重復兩次!癮{2,4}”表示字母“a”重復2到4次。“a{2,}”表示字母“a”重復2到無限多次。注意“{}”里面必須沒有空格。而且它沒有對上限值和下限值限定范圍。所有的重復表達式參考盡可能短的前子表達式:一個單獨字符,一個字符集,或者一個用“()”括起來的子表達式,舉幾個例子:
? "ba*"匹配所有的"b","ba","baaa" 等等。
? "ba+"匹配"ba"或"baaa",但是不匹配"b"。
? "ba?"匹配"b"或者"ba"。
? "ba{2,4}"匹配"baa","baaa","baaaa"。
懶惰型重復
在重復之后附加一個“?”就是懶惰型的重復了。一個懶惰型的重復是指匹配盡可能短的字符串。
例如:匹配HTML標記對可以使用下面這樣的正則表達式:
"<\s*tagname[^>]*>(.*?)<\s*/tagname\s*>"
在這種情況下$1將包含標簽對之間的文本,而且是最短的匹配字符串。
插入成份
插入成分有兩個用處——把項目編組到子表達式中,并且對生成的匹配標號。例如,表達式"(ab)*"將匹配所有的這類字符串"ababab"。所有的被插入成份標號的子匹配將可以用\N或者$N語法來回溯引用到。它允許子表達式匹配空字符串,子表達式以1為開始從左往右編號。子表達式0就是整個表達式。
正則表達式
無標記插入
有時候你需要把子表達式編組為插入成份,但是不想為這個插入成分而吐出另一個標記的子表達式。在這種情況下,一個非標記插入(?:expression)可能有用。例如,下例表達式可以創(chuàng)建一個非子表達式:
"(?:abc)*"
N擇1標記
當表達式可以匹配一個子表達式或另一個的時候,N擇1標記起作用了。每個N擇1可以用|隔開。每個N擇1標記是一個最大可能性前綴子表達式,它是和重復操作符相反的行為。
示例:
? "a(b|c)"匹配"ab"或"ac"
? "abc|def"匹配"abc"或"def"
預置符
一個預置符是一個可以匹配所有作為預置成員的單個字符的預置。預置字符用方括號“[”和“]”括起來,可以容納字面值、字符序列、字符類、經整理過的對象以及等價的類。用^打頭的預置聲明可以排除包含的內容。
示例:
字面值
? "[abc]"匹配"a"或"b"或"b"。
? "[^abc]"匹配"a"和"b"和"c"之外的所有字符。
字符序列
? "[a-z]"匹配所有的從"a"到"z"的字符
? "[^A-Z]"匹配所有的字符除了從"A"到"Z"的這些字符。
字符類
字符類用語法"[:classname:]"來表示,classname是聲明過的預設值中的一個。例如:"[[:space:]]"是所有的空白占位符的預設。下表中的字符類是可用的:
alnum | 所有的alpha數字字母 |
alpha | 字母表字符[a-zA-Z]。其它字符也可以包含在內,這取決于本地環(huán)境 |
blank | 所有的空白字符,包含回車或者空格 |
cntrl | 所有的控制字符 |
digit | 從0到9的數字 |
graph | 所有的圖畫字符 |
lower | 所有的小寫字母[a-z],其它的字符也可以包含在內,這取決于本地環(huán)境 |
所有的印刷字符 | |
punct | 所有的標點符號 |
space | 所有的空白占位符 |
upper | 所有的大寫字母[A-Z],其它的字符也可以包含在內,這取決于本地環(huán)境 |
xdigit | 所有的16進字字符0~9,A-F |
word | 所有的詞匯字符,包括字母數字外加underscore |
unicode | 所有的編碼大于255的字符,這只對大范圍字符特征類生效 |
這里有一些縮寫法可以代替以上字符類:
? \w 代替 [:word:]
? \s 代替 [:space:]
? \d 代替 [:digit:]
? \l 代替 [:lower:]
? \u 代替 [:upper:]
正則表達式
集合元素一般采用預置聲明內加[.tagname.]的格式。其中tagname既可以是一個單個字符,也可以是一個集合元素名。例如:[[.a.]]等價于[a],[[.comma.]]等價于[,]。ISAPI_Rewrite支持所有的標準POSIX集合元素名,以及下面的這些字符組合:“ae”、“ch”、“l(fā)l”、“ss”、“nj”、“dz”、“l(fā)j”、任意小寫、大寫、首字母大寫的變化組合。多個字符集合元素可以導致預置匹配一個以上的字符。例如:[[.ae.]]將匹配兩個字符,但是[^[.ae.]]只會匹配一個字符。
等價類
等價類一般采用預置聲明內加[=tagname=]的格式,其中tagname既可以是單個字符,也可以是一個集合元素的名稱,它能匹配同樣的主要等價類成員的字符,就跟集合元素[.tagname.]一樣。一個等級類是一個相同整理的字符預設,但主要是一個等價類的字符集,其主要排序關鍵字都是一樣的(例如,字符串通常先依字符整理,然后根據重音,然后根據大小寫。主要排序鍵與字符相關,次要與重音相關,再次與大小寫相關。如果沒有等價類符合tagname,則[=tagname=]是與[.tagname.]完全一樣的。
Equivalence classes take the general form [=tagname=] inside a set declaration, where tagname is either a single character, or a name of a collating element, and matches any character that is a member of the same primary equivalence class as the collating element [.tagname.]. An equivalence class is a set of characters that collate the same, a primary equivalence class is a set of characters whose primary sort key are all the same (for example strings are typically collated by character, then by accent, and then by case; the primary sort key then relates to the character, the secondary to the accentation, and the tertiary to the case). If there is no equivalence class corresponding to tagname, then [=tagname=] is exactly the same as [.tagname.].
要在一個預設中包含字面值“-”,請這樣做:使它成為開放的“[”或者“[^”后面的第一個字符、一個系列或者一個集合元素的末點,或者用一個前置的轉義字符如“[\-]”。要在一個預設中包含一個字面值“[”或者“]”或者“^”,請把它們作為一個系列或者一個集合元素的末點,或者用一個前置的轉義字符。
行錨
錨用來匹配一行開頭或結尾的空串!癪”匹配行開頭的空串,“$”匹配行結尾的空串。
回溯引用
回溯引用是引用前面已經被匹配的子表達式。這個引用是被匹配的子表達式,而不是表達式本身;厮菀冒ㄞD義字符“\”跟著一個從1到9的數字。“\1”引用第一個子表達式,“\2”引用第二個,依次類推。舉個例子,表達式“(.*)\1”匹配任何關于它的中點重復的字符串,比如說“abcabc”或者“xyzxyz”。一個對子表達式的回溯引用不參加任何匹配,匹配空字符串。在ISAPI_Rewrite中,所有的回溯引用是對整個RewriteRule和相應的RewriteCond指令是全局性相關的。RewriteRule指令中如果有RewirteCond子令的話,子匹配從相應的RewriteRule指令的第一個RewriteCond指令開始從上到下從左往右編號。
向前查找
向前查找有兩種形式:正向前查找和負向前查找。
• "(?=abc)"匹配跟在表達式"abc"后面的零字符。
• "(?!abc)"匹配不跟在表達式"abc"后面的零字符。
通配符
下面的運算符提供了與GNU正則表達式庫的兼容性。
• "\w"匹配任意單個組詞字符,它等價于表達式“[[:word:]]”。
• "\W"匹配任意一個非組詞字符,它等價于表達式“[^[:word:]]”。
• "\<"匹配詞頭空字符串。
• "\>"匹配詞尾空字符串。
• "\b"匹配詞頭或者詞尾空字符串。
• "\B"匹配詞語中的空字符串。
轉義字符
轉義字符“\”含有多重意義:
• 轉義字符可以引導一個運算符,例如:回溯引用、詞操作符
• 轉義字符可以使下面的字符正常,比如說“\*”代表一個字面值“*”,而不是重復運算符。
單個字符轉義序列
下面的轉義序列是單個字符的別名:
轉義序列 | 字符代碼 | 含義 |
\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上有一些區(qū)別
轉義序列 | 含義 |
\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 | 開始引號運算符。后面跟前的所有的內容都被當作字面值,直到發(fā)現一個\E結束運算符。 |
\E | 結束引用運算符,終止一個由\Q開頭的引用序列。 |
怎樣得到匹配
正則表達式將匹配第一個可匹配字符串。如果從給定的起始處可以匹配到不止一個字符串,則它會匹配那個能匹配得最長的字符串。如果從同一個起始處有多個合適的匹配,而且每個匹配的長度都一樣,則將選擇那個第一子表達式匹配得最長的匹配。如果有兩個以上的匹配字符串它們的第一子表達式匹配得一樣長,則比較第二子表達式匹配的長度,如此類推。注意:ISAPI_Rewrite使用比封演算法。只有表達式匹配了整個順序串才能得到匹配結果。例如:
• RewriteCond URL ^/somedir/.* #將匹配任何導向somedir目錄以及它的子目錄的請求,與此同時,
• RewriteCond URL ^/somedir/ #只匹配somedir根目錄的請求。
對“病態(tài)”正則表達式的特別提示:
ISAPI_Rewrite 使用了一個非常強大的來自Boost庫的正則表達式引擎。但是它依然有一些局限性:有著一些“病態(tài)”的表達式,它可能會指數級地消耗匹配時間。這些都涉及到嵌套重復運算符,例如試圖對N個連續(xù)字母a匹配表達式“(a*a)*b”,消耗的時間將與N2成正比。這些表達式常常能改成另一種寫法來避免這種問題。例如,“(a*a)*b”可以被改寫成“a*b”,解析它消耗的時間與N成正比。在多數情況下,非嵌套重復表達式消耗的時間與N2成正比,但是,如果條款是相互排斥的,則它們會在線性時間里完成匹配。在“a*b”這種情況下,每個字符將要么匹配a要么匹配b或者不匹配。相較之下,“a*a”匹配器不能告知哪個分支被采。ǖ谝粋 a還是第二個a)因此必須嘗試兩種。
Regex可以檢測出這種“病態(tài)”的正則表達式并終止和它們的匹配。這將使ISAPI_Rewrite的規(guī)則失效。當一個規(guī)則失效時,ISAPI_Rewrite將給客戶端發(fā)送一個"Internal Server error - Rule Failed"的狀態(tài),以表示配置錯誤。
4.1AccessFileName指令
說明 | 設置分布式配置文件的名稱 |
語法 | AccessFileName filename [filename] ... |
默認值 | AccessFileName .htaccess |
使用環(huán)境 | server config |
指定一個ISAPI_ReWrite尋求分布式配置的文件名列表。默認文件名是.htaccess。ISAPI_ReWrite只能載入它能在這個列表中找到的第一個文件。默認情況下ISAPI_ReWrite管理者會以hidden屬性標記配置文件-它將防止文件被遠程用戶直接訪問到。
如果配置文件進行了任何修改,它將在下次請求服務器時自動加載。
4.2AllowOverride指令
說明 | 明確規(guī)定了每個目錄重寫的基準URL。 |
語法 | AllowOverride All|None|directive-type [directive-type] ... |
默認值 | AllowOverride All |
使用環(huán)境 | server config, virtual host, directory |
這個指令聲明了在分布式.htaccess文件里的指令是否可以覆蓋父級別的httpd.conf中的指令。在ISAPI_Rewrite的使用環(huán)境中,這個指令實際上控制了特定虛擬主機或者目錄的.htaccess文件的可用或者不可用。目前只支持三個值:All、None和FileInfo。
All和FileInfo使.htaccess文件以及它里面的整個ISAPI_Rewrite目錄可用,None使所有的.htaccess文件以及目錄不可用。這些目錄具有繼承性。這意味著如果你為一些目錄或者虛擬主機指定AllowOverride none,.htaccess文件將對整個子目錄樹不可用。
4.4RewriteRule指令
說明 | 定義URL重寫規(guī)則 |
語法 | RewriteRule Pattern Substitution [flags] |
使用環(huán)境 | server config, virtual host, directory, .htaccess |
這個指令定義了單個URL重寫操作。它可能在一個配置文件中出現多次,每個實例定義一個重寫URL的規(guī)則。RewriteRule指令包含URL匹配模式、替換字符串以及可選的標志設置。
Pattern(模式)是一個用來匹配當前URL的Perl兼容正則表達式。當前的URL可以是原來請求的URL或者已經由優(yōu)先級高的規(guī)則替改過的URL。網址從不包含協議或者主機名,從第一個斜杠字符開始(只對httpd.conf文件適用)。而且當前網址還因不同的應用配置級別而異。對于目錄級配置(.htaccess文件),結尾的斜線和配置文件的目錄名,會在匹配時被從URL中忽略掉。在創(chuàng)建正則表達式時,請閱讀這個文檔的正則表達式語法部分來得到更多的信息。
"!"字符打頭的模式將否定整個表達式。否定模式不能產生子匹配,所以你不能使用$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的后續(xù)字符串 |
\\ | 單個反斜杠字符'\' |
RewriteRule從父配置文件開始按照在配置文件中出現的次序應用。每個規(guī)則只有在它的Pattern匹配了一個URL而且所有連接條件(RewriteCond)都匹配時才會被應用。在該URL用Substitution完成替換之后,重寫過程還在繼續(xù),一直到配置文件結束或者遇到一個用了任何停止標志的規(guī)則。在Substitution中的特殊字符串"-"(短橫)意味著沒有替換,而且當你需要應用該規(guī)則并留下的原始的未被染指過的URL時它是很有用的。
此外,這里有一個支持的flag(標志)列表。這些標識可以改變規(guī)則的表現。與Apache完全兼容的標志被標記為綠色,不支持的標志被標記為綠色,只在 ISAPI_Rewrite中被支持的標識被標記成黃色。
CU (Case Upper)
把替換字符串改成大寫.
CL (Case Lower)
把替換字符串改成小寫.
chain|C
將當前規(guī)則與后一條規(guī)則鏈接起來,后一條規(guī)則只有在當前規(guī)則被匹配的情況下才能被執(zhí)行。鏈接可以再后續(xù)鏈接。
cookie|CO=NAME:VAL:domain[:lifetime[:path]]
設置一個有指定字段的cookies頭,并把它和當前請求的響應一起發(fā)送到客戶端。
env|E=VAR:VAL
不支持,在UNIX環(huán)境中設置一個環(huán)境變量,在Windows系統(tǒng)中無意義。
forbidden|F
發(fā)送即時403 FORBIDDEN響應到客戶端,停止這個請求的規(guī)則處理以及所有其他的替換處理。
gone|G
發(fā)送一個即時401Gone響應到客戶端,停止這個請求的規(guī)則處理以及所有其他的替換過程。
handler|H=Content-handler
不支持,為請求明確指定了處理處理。在IIS的世界中這是可以通過重寫請求的文件擴展名來實現。但是沒有從Apache處理到IIS文件擴展名的直接轉換方法。
last|L
停止這里的重寫處理,不再應用當前配置文件中的其它規(guī)則。在這種情況下,后代的.htaccess文件依然能被用到。
loop|LP
在一個循環(huán)中重復運行當前單個規(guī)則直到它的模式以及條件不再被匹配了。循環(huán)次數被限定為200免得陷入無限循環(huán)。
next|N
從當前配置文件開始處重復運行重寫處理。循環(huán)次數被限定為200免得陷入無限循環(huán)。
nocase|NC
這個標記使Pattern大小寫不敏感。
noescape|NE
不轉義輸出。在ISAPI_Rewrite默認情況下,在輸出中會把所有的非ANSI字符編碼為十六進制數%xx。
nosubreq|NS
這個標識在ISAPI_Rewrite中與在Apache中含義不同。精確的轉換是不可能的,但這個標志可能仍然是有用的。每當配置文件處理完成之后,URL被重寫了,ISAPI_Rewrite將啟動這個新的URL處理過程(與Apache相同)使它可以應用到另一個配置文件中。此標識意思是該規(guī)則只針對初始用戶的請求執(zhí)行,不針對已被重寫過的請求執(zhí)行,以防可能出現的循環(huán)。ISAPI_Rewrite限定循環(huán)重復次數為10。
nounicode|NU
如果設置了NU標記,從Unicode轉換為UTF - 8將不會發(fā)生。所有Unicode字符會保持它的%xx格式不變。
O (nOrmalize)
留著用于與ISAPI_Rewrite 2.x兼容。如果使用了RewriteCompatibility2,這個指令在處理之前將URL規(guī)范化。規(guī)范化包括移除一個URL編碼、錯誤字符,等等。同時URL的規(guī)范化將完全移除它的查詢字符串。如果RewriteCompatibility2 沒有被使用,URL按照默認被規(guī)范化(就如同它在mod_rewrite中所做的),此標志的含義將反轉。
proxy|P
將結果URL強制內部處理為另一臺服務器上的目標,并即時傳到遠程服務器上,并且,規(guī)則處理在這里中斷了。遠程服務器的響應將被傳遞回客戶端。proxy需要您指定完整的URL,由協議、主機名稱等開頭。ISAPI_Rewrite使用ISAPI擴展來處理代理請求。你可以在代理配置章節(jié)中閱讀到更多有關于此的內 容。
passthrough|PT
不支持或者始終支持。在IIS中結果始終傳遞到下一個處理
qsappend|QSA
追加當前查找串的數據到替換串而不是由一個替換字符串取代它。當你需要在保留原來的參數再添加更多的查詢字符串參數時,可以使用它。
redirect|R [=code]
強制服務器用重定向指令給客戶端發(fā)送一個即時響應,提供一個新的接替位置?梢赃x加前綴http://thishost[:thissport]/從而把URL帶到一個可用的絕對形式。如果沒有給出代碼,將使用一個302響應(暫時性移動)。你可以選擇在3XX系列范圍內指定任何代碼。
skip|S=num
如果當前的規(guī)則匹配,強制rewrite引擎跳過后面num個規(guī)則。
type|T=MIME-type
強制目標文件的MIME類型轉換成被設定的MIME類型。這能夠被用來根據一些條件設置內容類型。
U (Unmangle log)
無損記錄。記錄它原來請求的網址,而不是被重寫的URL。
4.5RewriteCond指令
說明 | 為以下的RewriteRule定義一個條件 |
語法 | RewriteCond TestString CondPattern |
使用環(huán)境 | server config, virtual host, directory, .htaccess |
該指令為后面的RewriteRule,RewriteHeader或RewriteProxy指令規(guī)定了一個條件。一個規(guī)則指令前可以有一個或多個條件,規(guī)則只有在所有條件得到滿足的情況下才被應用。
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' (擁有可執(zhí)行權限) 不支持的,始終為true。
10.'-F' (存在的文件,通過子請求) 不支持,和'–f'一樣。
11.'-U' (存在的URL,通過子請求) 不支持的,始終為false。
下面的標記也是支持的:
'nocase|NC'
這個標記使模式大小寫不敏感。
'ornext|OR'
這個標記用邏輯或而不是隱含的邏輯與結合子請求RewriteCond指令。
O
留用于ISAPI_Rewrite 2.x的兼容性。在處理前規(guī)范化字符串。規(guī)范化包括移除一個URL編碼、錯誤字符,等等。同時URL的規(guī)范化將完全移除它的查詢字符串。
4.6RewriteBase指令
說明 | 為每個目錄的重寫設置一個基準的URL |
語法 | RewriteBase URL-path |
默認值 | RewriteBase requested-directory-path |
使用環(huán)境 | directory, .htaccess |
當RewriteRule指令用于每個目錄的配置文件(.htaccess)時,它將自動從路徑中剝去本地目錄前綴,只對剩下的部分應用規(guī)則。RewriteBase指令允許你為這些規(guī)則精確指定一個基準。比如,哪部分要被剝離。
和Apache的mod_rewrite不同,ISAPI_Rewrite的訪問不僅僅針對于物理路徑,同時還針對于虛擬路徑,而且可以自動地選擇正確的基準。所以這個指令只是為了兼容性原因而被保留的。
URL-path可以是相對于根的路徑也可以是空,空的URL-path意味著規(guī)則的基準等同于網站的根目錄。
4.7RewriteProxy指令
說明 | 代理請求到一個遠程服務器 |
語法 | RewriteProxy Pattern Substitution [flags] |
使用環(huán)境 | server config, virtual host, directory, .htaccess |
使結果URL被內部處理為另一臺服務器上的目標,并即時傳遞到遠程服務器,從此中斷了規(guī)則處理。遠程服務器的響應將被傳遞回客戶端。代理要求您指定完整的URL,由協議,主機名稱等開頭。ISAPI_Rewrite使用ISAPI擴展來處理代理請求。你可以在配置代理的章節(jié)里閱讀到更多。
語法和操作符與RewriteRule指令是相同的。但是RewroteProxy指令支持一些額外的標記。
H (preserve Host)
代理模塊在連接遠程服務器時將使用隨著源請求一起發(fā)送過來的主機頭,如果沒有這個標志代理服務器則將用主機名和遠程服務器的端口號組成主機頭。
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] |
使用環(huán)境 | server config, virtual host, directory, .htaccess |
這個RewriteHeader指令是RewriteRule指令中的一個很常用的變量。而且它被設計用來重寫客戶端的URL部分以及HTTP頭的部分。技術上的RewriteRule指令,相當于RewriteHeader的URL Pattern Substitution [flag]。這個指令可用于在IIS里更多應用程序的處理之前重寫、創(chuàng)建或者刪除任何客戶端請求的HTTP頭。
HeaderName:指定將被重寫的HTTP頭的名字。
pattern、Substitution和flag與RewriteRule指令中都是相同的。
4.9RewriteMap指令
說明 | 為一個映射函數值定義一個鍵 |
語法 | RewriteMap MapName MapType:MapSource |
使用環(huán)境 | server config, virtual host, directory, .htaccess |
RewriteMap指令被用來定義一個鍵到值的查找功能。當你需要映射大量的值時,它會很有用的,而且它的速度遠遠快過用規(guī)則匹配來做到它。映射功能的性能受映射文件的大小影響微乎其微。有三種類型的映射:
• 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文件系統(tǒng)路徑。文本文檔必須是如下格式的:
#This is a comment key1 value1 #Another comment key2 value2 keyN valueN
rnd:隨機查找多個值。Source是一個文本文檔的路徑,文本文檔必須是以下格式:
#This is a comment key1 value1|value2|value3 key2 value4|value5|value6|valueN
int: 調用內部函數。 Source必須是下列預定義的內部函數之一:
• toupper: 轉換關鍵詞為大寫形式。
• tolower:轉換關鍵詞為小寫形式。
• escape:把特定字符編碼為十六進制。
• unescape:把十六進制值編譯為特定字符。
4.10RewriteLog指令
說明 | 設置ISAPI_Rewrite日志文件的名稱 |
語法 | RewriteLog file-path |
默認值 | RewriteLog installdir\rewrite.log |
使用環(huán)境 | server config |
這個指令用來設定記錄ISAPI_Rewrite動作的日志文件的文件名。示例:
Rewritelog "C:\local\path\rewrite.log"
4.11RewriteLogLevel指令
說明 | 設置日志級別 |
語法 | RewriteLogLevel Level |
默認值 | RewriteLogLevel 0 |
使用環(huán)境 | server config |
這個指令設置日志的輸出長度。默認值0表示不記日志,而最大的級別9則表示所有的動作都要記錄。
使用使用較高的級別值可能會降低ISAPI_Rewrite的操作速度。我們建議你當你完成規(guī)則調試之后,通過設置日志級別為零來禁用日志。
4.12RewriteOptions指令
說明 | 指定特殊選項 |
語法 | RewriteOptions Options |
使用環(huán)境 | server config, virtual host, directory, .htaccess |
這個指令可以為ISAPI_Rewrite設置特定選項。當前只有惟一一個選項可用:inherit。
inherit:強迫當前配置從父級繼承所有的選項和規(guī)則。這意味著來自父級配置的所有的規(guī)則將被再次執(zhí)行,除非當前環(huán)境另有相應重寫規(guī)則。
4.13RewriteCompatibility2指令
說明 | 啟用或禁用ISAPI_Rewrite 2.x兼容模式 |
語法 | RewriteCompatibility2 on|off |
默認值 | RewriteCompatibility2 off |
使用環(huán)境 | server config, virtual host, directory, .htaccess |
這一指令將激活與ISAPI_Rewrite 2.x版的兼容性,將一些2.X的規(guī)則正確地翻譯為3.0版本的語法。這并不意味著ISAPI_Rewrite 3將開始懂得不經修改舊的語法。如果您有針對ISAPI_Rewrite 2.X的舊設計請使用ISAPI_Rewrite提供的翻譯工具將這些舊規(guī)則轉化為新的語法規(guī)則。
現在通過設置指令RewriteCompatibility2唯一改變的是,它將關閉網址常規(guī)前綴并刪除查詢字符串。 Apache的mod_rewrite將刪除匹配的URL的查詢字符串的這部分,相較之下ISAPI_Rewrite 2.X將匹配整個網址(包括查詢字符串在內),而且[O]標記的意思將由該指令倒置。
4.14ErrorLog指令
說明 | 一般的錯誤文件的位置 |
語法 | ErrorLog file-path |
默認值 | ErrorLog installdir\rewrite.log |
使用環(huán)境 | server config |
這個指令設置存放ISAPI_Rewrite整體錯誤和消息的日志文件的名稱。例如httpd.conf file load, .htaccess file load,等等
例:ErrorLog "C:local\path\error.log"
4.15LogLevel指令
說明 | 設置一般的錯誤的日志級別 |
語法 | LogLevel Level |
默認 | LogLevel warn |
使用環(huán)境 | server config |
這個指令設置一般日志的輸出長度,跟它的重寫過程無關。這里有一個level的可用值列表:emerg、alert、crit、error、warm、notice、info、debug。當前的ISAPI_Rewrite日志只記錄錯誤信息。
設置LogLevel調試來解決配置文件中加載的問題。
4.16<VirtualHost>指令
說明 | 把應用于特定IP地或者主機的指令編組 |
語法 | <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> |
使用環(huán)境 | server config |
<VirtualHost> ... </VirtualHost>標簽用來對應用到特定虛擬主機里的指令進行分組。
addr的可用值為:
• 特定的IP地址
• 完整的域名
• 字符'*'可以匹配任何主機或者特定服務器的任何端口號。
例如:
RewriteEngine off AllowOverride none <VirtualHost onesite.com www.onesite.com> RewriteEngine on AllowOverride all </VirtualHost>
不要忘了在每個<VirtualHost>標簽中包含RewriteEngine on指令,也不要將不能應用的規(guī)則封裝進去。
4.17<Directory>指令
說明 | 將適用于特定的文件系統(tǒng)的目錄和子目錄的指令編組 |
語法 | <Directory directory-path> ... </Directory> |
使用環(huán)境 | server config, virtual host |
<Directory> ... </Directory>標簽被用來對應用到特定文件系統(tǒng)目錄以及子目錄的指令進行分組。通配符?和*是可用的。正則表達式也是可用的,需要以~字符打頭。
對目錄路徑參數必須小心:它們必須字面匹配用來訪問文件的文件系統(tǒng)路徑,用于某一特定<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指令,也不要將不能應用的規(guī)則封裝進去。
4.18<DirectoryMatch>指令
說明 | 將適用于特定的文件系統(tǒng)的目錄和子目錄的指令編組 |
語法 | <DirectoryMatch regex> ... </DirectoryMatch> |
使用環(huán)境 | server config, virtual host |
<DirectoryMatch> ... </DirectoryMatch> 被用來封裝一個只適用于指定的文件系統(tǒng)的目錄和子目錄的指令組。這個指令和<Directory ~> 語法相同。
示例:
<DirectoryMatch "^/www/(.+/)?[0-9]{3}"> # ... directives here ... </DirectoryMatch>
不要忘了在每個< DirectoryMatch>標簽中包含 RewriteEngine on指令,也不要將不能應用的規(guī)則封裝進去。
4.19<Files> 指令
說明 | 將應用于匹配文件名的指令包裝起來 |
語法 | <Files filename> ... </Files> |
使用環(huán)境 | server config, virtual host, directory, .htaccess |
<File>指令以文件名限定了封裝的指令的作用域。filename參數必須包含一個文件名,支持?和*以及以~字符打頭的正則表達式。
示例:
<Files index.*> # ... directives here ... </Files> <Files ~ "\.(gif|jpe?g|png)$"> # ... directives here ... </Files>
不要忘了在每個<Files>標簽中包含RewriteEngine on指令,也不要將不能應用的規(guī)則封裝進去。
4.20<FilesMatch>指令
說明 | 將應用于匹配文件名的指令包裝起來 |
語法 | <FilesMatch regex> ... </FilesMatch> |
使用環(huán)境 | server config, virtual host, directory, .htaccess |
<FilesMatch>指令的語法和_指令"><Files ~>語法完全一樣。
<FilesMatch "\.(gif|jpe?g|png)$">
不要忘了在每個<FilesMatch>標簽中包含RewriteEngine on指令,也不要將不能應用的規(guī)則封裝進去。
4.21<Location>指令
說明 | 把被包裝起來的指令集應用到匹配的URL或者虛擬路徑 |
語法 | <Location URL-path|URL> ... </Location> |
使用環(huán)境 | server config, virtual host |
<Location> ... </Location>標簽用來將應用到特定URL或者虛擬路徑的指令分組。<Location>將運算符完全從文件系統(tǒng)中分劃出來,因此那些指令將不會用來控制對文件文件系統(tǒng)位置的訪問。因為有幾個不同的URL可能映射到相同的文件系統(tǒng)位置。
該URL-path是一個形式為“/path/”的虛擬路徑。沒有協議、主機名、端口號、查詢請求字符串被包含在內。URL-path可以包含通配符?和*或者以~字符打頭的正則表達式。
示例:
<Location /directory> # ... rules go here </Location> <Location /> # ... more rules go here </Location>
不要忘了在每個<Location>標簽中包含RewriteEngine on指令,也不要將不需要用到的規(guī)則封套進去。
4.22<LocationMatch>指令
說明 | 把被包裝起來的指令集應用到正則表達式匹配的URL上 |
語法 | <LocationMatch regex> ... </LocationMatch> |
使用環(huán)境 | server config, virtual host |
這個指令的語法和指令"><Location ~>正則表達式語法完全一樣。
示例:
<LocationMatch "/(home|section)/bin"> # ... rules go here </LocationMatch>
不要忘了在每個<LocationMatch>標簽中包含RewriteEngine on指令,也不要將不能應用的規(guī)則封裝進去。
示例
簡單的搜索引擎友好的網址
下面這個例子演示了如何輕松地使用循環(huán)標記藏匿查詢字符串參數。假設你有一個如下的URL:http://www.mysite.com/foo.asp?a=A&b=B&c=C,而且你希望以這樣的地址來訪問它:http://www.myhost.com/foo.asp/a/A/b/B/c/C
請嘗試用下面的規(guī)則來達到預期的效果:
RewriteEngine on RewriteRule ^(.*?\.asp)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,LP,QSA]注意這個規(guī)則可能破壞頁面與CSS文件、圖片等的相對鏈接。至所以這樣是因為在瀏覽器中用于推算完整資源URI的基本路徑(頁面的父文件夾)發(fā)生了變化。只有在您使用目錄分隔符作為替代字符時才會發(fā)生這個問題。有三種可用的解決方案:
1.使用下面的規(guī)則,它不影響基本路徑,因為它沒有用到目錄分隔符“/”。
2.借助于<base href="/folder/">標簽直接為頁面指定正確的base路徑
3.把所有的頁面相對鏈接都變成相對于根目錄的地址或者絕對地址形式。
還存在著很多種用了不同的分隔符和文件擴展名的規(guī)則。例如,使用像這樣的URL:http://www.myhost.com/foo.asp~a~A~b~B~c~C。下面的規(guī)則可以用來實現它:
RewriteEngine on RewriteRule ^(.*?\.asp)~([^~]*)~([^~]*)(.*) $1$4?$2=$3 [NC,LP,QSA]富關鍵詞URLs
在上面的例子中,我們使用很一般的技術來簡單地藏匿查詢字符串標記。但是很多對搜索引擎優(yōu)化很有用的解決方案是讓您的URL關鍵字豐富?纯聪旅娴木W址,例如:http://www.mysite.com/productpage.asp?productID=127這是大部分網站的常見情況。但是你可以通過使用這樣形式的鏈接來顯著地提高你的網頁搜索引擎抓取率:http://www.mysite.com/products/our_super_tool.asp,URL中的關鍵詞“our super tool”會被索引,并提高網頁排名,但是“our_super_tool”不能直接被用來收回productid=127,這個問題存在幾種解決方案。
第一個解決方案,我們建議你使用簡短、只包含少數幾個參數(既有關鍵詞也有數字標識符)的URL形式,在樣您的URL可能看起來如下:
http://www.mysite.com/products/our_super_tool_127.asp。實現這一重寫目標只需要一個規(guī)則:
RewriteEngine on RewriteBase / RewriteRule ^products/[^?/]*_(\d+)\.asp /productpage.asp?productID=$1 [QSA]
另一個更復雜的解決方案是創(chuàng)建一對一的映射文件,并用它來映射“our_super_tool”到127。該解決方案對一些有很多參數的長URL來說很有用,并允許你隱藏數字標識符。這URL看起來像是http://www.mysite.com/products/our_super_tool.asp。請注意“our_supper_tool”部分必須是產品的唯一標識,是它的標識符。下面是這種解決方案的一個示例:
RewriteEngine on RewriteBase / RewriteMap mapfile txt:mapfile.txt RewriteRule ^products/([^?/]+)\.asp /productpage.asp?productID=${mapfile:$1}
而且你必需創(chuàng)建包含以下內容的mapfile.txt映射文件:
one_product 1 another_product 2 our_super_tool 127 more_products 335
這種方法的優(yōu)點是:你可以使用它來組合十分復雜的URL轉換,但是這是一個小例子,是這個指南中的題外之話。
使用IIS作為反向代理 假設你有運行IIS的互聯網服務器以及幾臺后臺服務器或者應用程序運行在其它平臺或者機器上。這些服務器不能直接在互聯網上閱覽,但是你必須為他人提供訪問這些服務器的渠道。這里有一個演示如何簡單地將某個網站的完整內容映射到另一個運行了ISAPI_Rewrite的站點的文件夾的示例:
RewriteEngine on RewriteBase / RewriteRule mappoint(.+) http://sitedomain$1 [NC,P]
藏匿文件擴展名: 雖然不可能將一個站點的所有的文件的擴展名都藏匿起來,但是我們可以使用ISAPI_Rewrite的文件檢查功能來隱藏某些已知擴展名。這里有一個藏匿網站上.asp文件擴展名的規(guī)則示例:
RewriteEngine on #Redirect extension requests to avoid duplicate content RewriteRule ^([^?]+)\.asp$ $1 [NC,R=301,L] #Internally add extensions to request RewriteCond %{REQUEST_FILENAME}.asp -f RewriteRule (.*) $1.asp
仿真基于主機頭的虛擬網站 例如你已經注冊了兩個域名www.site1.com和www.site2.com,F在你可以使用同一個物理站創(chuàng)建兩個不同的站點了。這里是一個規(guī)則示例:
RewriteEngine on #Fix missing trailing slash char on folders RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L] #Emulate site1 RewriteCond %{HTTP:Host} ^(?:www\.)?site1\.com$ RewriteRule (.*) /site1$1 [NC,L,NS] #Emulate site2 RewriteCond %{HTTP:Host} ^(?:www\.)?site2\.com$ RewriteRule (.*) /site2$1 [NC,L,NS]
現在只要把你的站點分別放到/site1和/site2目錄下就可以了。注意www.site1.com和www.site2.com這兩個域名必須在IIS中被映射到這個網站里,從而使ISAPI_Rewrite能攔截到請求。
或者,你可以使用更多通用的規(guī)則,從而把任何請求都映射到與請求主機名同名的文件夾里。
RewriteEngine on #Fix missing trailing slash char on folders RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L] #Map requests to the folders RewriteCond %{HTTP:Host} ^(www\.)?(.+) RewriteRule (.*) /%2$1 [NS]
網站的目錄名應該是這樣子的:/somesite1.com,/somesite2.info,等等。
阻斷內聯圖像(阻止盜鏈) 假如你有一些頁面插入了http://www.mysite.com/下的gif圖片。一些其它站點將通過網頁超鏈接插入這些圖片。這會給你的網站增加很多無用的通訊量,而且你希望阻止這種做法。
雖然用ISAPI_Rewrite不能100%地保護圖片不被盜鏈(只有專門的反盜鏈產品才能做到它),你至少可以在瀏覽器發(fā)來HTTP引用頭的時候限制這種情況。下面的規(guī)則可以讓你只允許來自同一主機的引用頁或者空地址訪問到這些圖片。
RewriteEngine on RewriteCond %{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重定向規(guī)則。
RewriteEngine on RewriteCond %{HTTPS} (on)? RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC] RewriteCond %{REQUEST_URI} (.+) RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]
強制SSL或者非SSL到一個指定的位置
這里是一個演示如何將SSL強制轉到指定的文件夾的示例。只要簡單地把下面的規(guī)則放到該文件夾下的.htaccess文件里就可以了。
RewriteEngine on #Fix missing trailing slash char on folders RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L] #Redirect non-HTTPS to HTTPS RewriteCond %{HTTP:Host} (.*) RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} (.*) RewriteRule .? https://%1%2 [R,L]
而這個示例作用正好相反:將非SSL強制轉到指定文件夾。
RewriteEngine on #Fix missing trailing slash char on folders RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L] #Redirect HTTPS to non-HTTPS RewriteCond %{HTTP:Host} (.*) RewriteCond %{HTTPS} on RewriteCond %{REQUEST_URI} (.*) RewriteRule .? http://%1%2 [R,L]
轉移站點位置
當你把網站從一個域名移到另一個域名,或者從一個文件夾移動另一個文件夾里的時候,這是經常會遇到的問題。你希望將一個網站的所有請求重定向到另一個網站里,而且不丟失請求資源名以及參數。當你希望保留現有的網頁的排名和外鏈接的時候,它是非常有用的。這個解決方案是在舊的網站服務器上使用ISAPI_Rewrite:
RewriteEngine on #Permanent redirect to update old links RewriteRule (.+) http://newserver.com$1 [R=301,L]
平衡負荷仿真
這個示例模擬某種DNS輪換負荷平衡技術。假設你有主站www.mysite.com和數臺web服務器分別注冊為www[1-9].mysite.com。如果你在主服務器上安裝了ISAPI_Rewrite,你可以將初始的客戶端請求重定向到幾臺特定服務器,從而在幾臺服務器之間隨機攤開通訊量。一旦已重定向,客戶端將一直使用這一臺服務器。雖然這種解決方案并不非常理想,但是它確實能分攤你的通訊量并避免在維護會話狀態(tài)方面發(fā)生的問題。
使用下面的規(guī)則來重定向客戶端:
RewriteEngine on RewriteMap hosts rnd:hosts.txt RewriteCond %{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里使用。
故障處理
在這里你可以一步步找到你在安裝ISAPI時遇到的問題的解決方法。
1.首先要正確解決您的問題,我們需要你運行最新的可用版本的ISAPI_Rewrite軟件。你可以隨時到我們的網站下載最新版的軟件來升級你的ISAPI_Rewrite。地址是http://www.helicontech.com/download-isapi_rewrite3.htm 。
2.多數運行ISAPI_Rewrite的問題發(fā)生在服務器上NTFS權限限制上。所以,請先閱讀需要運行ISAPI_Rewrite文件的權限。
3.請檢查應用程序和系統(tǒng)日志中的錯誤信息。這可能指出您的錯誤原因。
4.不要忘記設置RewriteEngine on指令在你所用的每個配置文件中。
5.把下列代碼行放到httpd.conf文件中:
RewriteLogLevel 9 LogLevel debug它將創(chuàng)建error.log和rewrite.log兩個日志文件,默認放在安裝目錄下。如果日志文件被創(chuàng)建了,它表明ISAPI_Rewrite正在運行。閱讀作為結果的error.log和rewrite.log文件,將能告訴你一些問題的根源線索。
6.如果httpd.conf規(guī)則正在生效,但是.htaccess文件卻沒有載入,請再次檢查.htaccess文件的NTFS權限,并確保你沒有在使用ISAPI_Rewrite的精簡版。
7.如果規(guī)則在httpd.conf里能生效,但是有其它部分或者.htaccess文件里不能生效,請確保在每個部分的或者.htaccess文件里包含RewriteEngine on指令。同樣的,不要忘掉.htaccess文件里的默認rewriting base值與httpd.conf是不同的。在.htaccess文件里或者<Directory>部分里,ISAPI_Rewrite會自動從路徑中剝離本地目錄前綴并只對剩下的部分應用規(guī)則。所以如果你的規(guī)則以“/”字符開頭的話,在網站根目錄的.htaccess文件中它必須被去掉。
如果你在使用ISAPI_Rewrite時依然有問題,請到技術支持論壇里來寫下你的問題,或者發(fā)送電子郵件到技術支持郵箱里。
請在您的支持請求里包括以下信息:
1.您的ISAPI_Rewrite配置文件,包括路徑和文件名。
2.您的網站的地址鏈接。
3.你用到測試你的規(guī)則的URL。
4.與失敗的請求error.log和rewrite.log的文件副本。
5.包括失敗的請求的部分IIS日志文件。
請記住你提供的信息越多,我們越容易為你解決問題。這樣你更有機會快速地得到解決方案。
ISAPI_Rewrite 發(fā)布歷史
發(fā)布 3.1.0.67
================
[篩選器功能] 增強映射文件的動態(tài)加載
[代理幫助文件錯誤]如果后端不設置內容長度頭的話,并不會返回所有的響應。
發(fā)布 3.1.0.66
================
精簡版的限制
ISAPI_Rewrite的精簡版擁有相同的引擎和重寫功能。但是也有下面這些限制:
? 不支持分布式.htaccess配置、目錄以及網站級配置,只有一個精簡版安裝目錄中的全局的httpd.conf配置能被載入。
? 不支持<VirtualHost>、<Directory>、<DirectoryMatch>、<Files>、<FilesMatch>、<Location> 以及<LocationMatch>這幾個標簽。
? 精簡版中沒有代理服務模塊,因而所有的和代理服務功能相關的比如說RewriteProxy指令以及[P]標記都會被忽略。
? 精簡版沒有針對于虛擬主機環(huán)境的手工安裝包
ISAPI_Rewrite精簡版完全免費,它對開發(fā)或者測試目的以及只有幾個網站而且不需要分布式配置或者代理功能的小型服務器來說是一個很好的解決方案
技術信息 ISAPI_Rewrite由四個部分組成:ISAPI篩選器、ISAPI擴展幫助、GUI管理器以及MMC嵌入式管理單元擴展。ISAPI_Rewrite篩選器和擴展都是用純C++語言寫的快速DLL模塊。當安裝ISAPI_Rwrite的時候, MMC嵌入式管理單元會被自動注冊。ISAPI篩選器將安裝在一個全局級別上,你不需要手工注冊它。ISAPI擴展也會被安裝并注冊。
ISAPI_Rewrite管理器實用工具可以在沒有安裝MMC的系統(tǒng)中運行ISAPI_Rewrite MMC嵌入式管理單元。
Windows Vista以及Windows Server 2008系統(tǒng)中的ISAPI_Rewrite管理器實用工具(Helicon Manager.exe)要求管理員權限來執(zhí)行,因為較小權限的用戶沒有權力讀取IIS管理元庫,而它對顯示網站配置來說是必需的。如果用受限的帳號運行ISAPI_Rewrite管理器,你會得到登錄管理員帳號的自動提示。
ISAPI_Rewrite篩選器已經有足夠地快,因此不用擔心它的性能。除非你的服務器運行在最大負荷之下。用戶在響應時間或者CPU負荷方面幾乎不能發(fā)現什么區(qū)別,但是如果用了很多的規(guī)則的話,服務器最大帶寬可能掉下一點來。所以請注意你用的配置決定了性能。建議每個網站使用的規(guī)則不要超過100條。在多數情況下,可以利用RewriteMap來避免使用大量的規(guī)則。
該程序使用了Regex++ 庫。
Regex++ (Version Boost 1.31)
Copyright ?1998-2004, Dr John Maddock
使用和傳播許可
該使用許可覆蓋了所有的現有版本的ISAPI_Rewite,包括ISAPI_Rewrite、ISAPI_Rewrite完全版、ISAPI_Rewrite精簡版、ISAPI_Rewrite測試版,后面統(tǒng)稱為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時,將發(fā)給你“注冊碼”。這種“注冊碼”可以個人或者公司購買,并只在一臺計算機上使用。如果您購買一個以上的ISAPI_Rewrite副本,發(fā)給你們的“注冊碼”只能在等于你購買的許可證數的計算機上使用。
10.您只能使用來自Helicom Tech以及與Helicom Tech有業(yè)務合作或者技術合作的公司的注冊碼。
11. 安裝和使用ISAPI_Rewrite意味著接受這些條款及許可條件。
12. 如果您不同意本許可證的條款或違反本許可與您當地的法律規(guī)定,您必須從您的存儲設備中刪除ISAPI_Rewrite文件,并停止使用該產品。
13.我們堅持嚴格的隱私的準則,不會收集個人識別信息,除非是自愿提供的。
如果您有進一步的問題或意見,請訪問我們的http://www.helicontech.com。
感謝你使用ISAPI_Rewrite。
Helicon Tech Corporation.
轉自:asprain