ISAPI_Rewrite 是一款適用於IIS的功能強大的基於正則表達式的URL處理模塊。它兼容Apache的mod_rewrite的語法,從而使僅僅複製.htaccess文件就把配置從appach移植到IIS中或者從IIS移值到appach中變成可能。第一章:軟體介紹 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精簡版是免費的。在這裡可以看到受限的細節說明。 大宗採購可議折扣。 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 擴展 2.2安裝程序 在運行安裝包之前請先閱讀系統要求部分。下載並安裝某個版本的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=Yes2.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 name RegistrationCode=REG-CODE-PROVIDED-FROM-HELICON依照「運行ISAPI_Rewrite的許可權需求」這一部分的說明來檢查文件系統許可權。
2.4反安裝反安裝程序會刪除所有安裝程序所生成的文件、從管理元庫中註銷篩選器,並刪除所有由安裝程序所添加的其它管理元庫變化。如果用戶決定在反安裝過程中保留用戶文件的話,下列用戶數據文件在反安裝後會被留下來。
文件名 |
說明 |
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=Yes2.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應用程序的屬性中給予一個「純腳本」的執行許可權。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_Rewrite3IIS:/LM/W3SVC/Filters/FilterLoadOrder append "ISAPI_Rewrite3"使用一個可執行文件(dll)發生在:安裝。 |
RemoveFilterFromMetabase從管理元庫中刪除篩選器 |
這個行為從IIS管理元庫里移除了名為ISAPI_Rewrite3的全局ISAPI篩選器。IIS5, IIS6 管理元庫: IIS://localhost/W3SVC/LM/W3SVC/Filters/ delete key ISAPI_Rewrite3IIS:/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_Rewrite3httpd.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%System32inetsrvisapi.dll" /> <add name="IsapiFilterModule" image="%windir%System32inetsrvfilter.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 FilesHeliconISAPI_Rewrite3ISAPI_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 FilesHeliconISAPI_Rewrite3ISAPI_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 FilesHeliconISAPI_Rewrite3ISAPI_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 FilesHeliconISAPI_Rewrite3ISAPI_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:ProgramFilesHeliconISAPI_Rewrite3ISAPI_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:ProgramFilesHeliconISAPI_Rewrite3ISAPI_RewriteProxy.dll" resourceType="Unspecified"/></handlers></system.webServer></configuration>使用JavaScript腳本發生在:反安裝、回滾。 |
3.1基本概念ISAPI_Rewrite提供了一個基於規則的重寫引擎能飛速重寫被請求的URL。它支持幾乎無限量的規則和幾乎無限量的附加規則條件來提供真正靈活和有效的URL處理機制。可以根據HTTP頭、伺服器變數、被請求的URL本身以及其它不同的條件的測試結果來對URL作出處理。URL數據處理是用一個文本配置文件來定製的,內含各種指令設置。配置分幾種等級。首先是全局(伺服器範圍的)配置指令,放置在ISAPI_Rewrite安裝目錄里的一個名為httpd.conf的文件里。那裡還有若干個標籤可以封裝應用到特殊位置的指令:<VirtualHost>、<Directory>、<DirectoryMatch>、<Files>、 <FilesMatch>、<Location>以及<LocationMatch>。最後ISAPI_Rewrite支持可以放在任何網站目錄里的.htaccess文件,那些文件中的規則可以應用到該位置以及它的子目錄中。所有的配置文件在每次修改文件後都會被自動重載。允許用第三方程序和腳本來修改文件。在很多情況下ISAPI_Rewrite是用來重寫URL的。除了重寫之外,ISAPI_REWRITE能夠修改、生成、刪除任何其它客戶端Request中的HTTP頭。模塊操作可以載入改寫、代理、重定向或者阻斷原始客戶端到伺服器的請求。Rewriting可能使伺服器在得到了一個客戶端的源請求時用一個新的URL繼續請求處理。新的URL可以包括查詢串部分(跟在問號後面),也可以指向任何一個完全的靜態文件或者腳本(例如asp)、或者程序(例如.exe),等等。對用戶和網站配置來說重寫是徹底透明的。因為它Web應用程序收到請求之前在伺服器內部執行。Proxying使URL經過內部處理後指向另一台伺服器,並很快傳遞到遠程伺服器上(換言之,規則處理在這裡中止了)。遠程伺服器的響應很快被傳回客戶端。代理伺服器要求你指定完整的有效URL,以協議、包括主機名開頭等等。ISAPI_Rewrite使用ISAPI擴展來處理代理請求,你可以在「代理伺服器配置」這一章里讀到更多信息。Redirection將發送一個帶有重定向指令的即時響應(HTTP響應碼為302或者說301),將網址設置為一個新的位置。您可以在重定向指令里使用絕對URL格式(這是RFC2616所要求的)將請求重定向到不同的主機、埠和協議。如果此信息被忽略, ISAPI_Rewrite將自動照當前的協議、伺服器名稱和目錄位置提供URL。重定向指令總是導致重寫引擎中止處理後面的規則序列。每個規則按它在配置文件中出現的順序來應用。目錄級配置文件從父路徑開始一個接一個地處理,來自於全局配置文件的規則最先適用。在修改URL之前ISAPI_Rewrite會保存原URL到Http頭,命名為X-Rewrite-URL。然後它能夠在腳本中作為HTTP_X_REWRITE_URL伺服器變數取回。因為在IIS里,系統變數名不能被修改,所以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指令隻影響單個規則。如果一些條件需要被用於多個規則,必須重複寫這些條件指令以應用到每條規則上。3.2和Apache下mod_rewrite的兼容性這個版本的ISAPI_Rewrite是為了最大程度上保持與Apache的mod_rewrite的兼容性。這個目標已經很大程度上實現了,儘管有一些功能無法執行,因為它們和Apeach以及UNIX結構高度綁定,而且它們在IIS上執行是不敏感的。舉例說明:第H條:「強制內容處理」標記不能執行,因為在IIS中內容處理的範圍依賴於擴展名。或者第[NS]條:「沒有子請求」標記是無意義的,因為在IIS中是沒有子請求的。這裡有一個完整的ISAPI_Rewrite和mod_rewrite兼容性圖表。標記為綠色的功能或指令是充分支持的,黃色的功能是部分支持或計劃在下一版本中支持,標示為紅色的功能是不支持的。· 兼容Perl的正則表達式 (plus extended syntax) · 伺服器級httpd.conf配置· 虛擬網站.htaccess配置文件· 目錄.htaccess配置文件· <VirtualHost> · <Directory> · <DirectoryMatch> · <Files> · <FilesMatch> · <Location> · <LocationMatch> · AccessFileName · RewriteEngine · RewriteRule o $N 規則後向引用o %N RewriteCond 後向引用o ${mapname:key|default} o %{VARNAME} 伺服器變數o "!" 取非o [C] 與下一個規則聯鎖o [CO=name:val:domain:lifetime:path] 設置cookie o [E=var:val] 設置環境變數o [F] 強制禁止應答o [G] 強制繼續應答o [H=content-handler] 明確的內容處理 (不適用) o [L] 上一個規則標記o [N] 再次應用規則o [NC] 大小寫不敏感o [NE] 不轉義輸出o [NS]非內部子請求o [P]代理通過o [PT] 傳遞通過下一個處理程序 (一直開啟) o [QSA] 追加查詢字元串o [R =code] 重定向o [S=num] 跳到下面第 n條規則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" 有可執行許可權的文件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 3.3使用環境以及處理順序以下是這個程序文檔中要被用到的使用環境的詳解:server config這個標誌表示該指令可以用在全局httpd.conf配置文件中,但是不能用在任何一個分區(例如<Virtualhost>或者<Directory>)內部。它不允許放在.htaccess文件中。vitrual host這意味著指令可以出現在<VirtualHost>容器內。directory這個標誌表示指令在<Diretory>、<Location>、<Files>容器內可用,而且它們的正則表達式是等價的。.htaccess使用環境標為它的指令可以出現在每個目錄的.htaccess文件中。記住當RewriteRule指令用在.htaccess配置文件中時,它將自動從路徑中剝去本地目錄前綴,只對剩下的部分應用規則。你可以使用RewriteBase指令顯式地給這些規則指定一個基本路徑。應用次序當同一分區內的多條指令同時適用時,理解每個分區應用的次序是很重要的,因為它會對最終效果起作用。應用次序如下所述:1.<Directory>(正則表達式除外):多個<Directory>分區可以應用於單個請求,如果多個(非正則表達式)<Directory>分區匹配了包含文檔的這個目錄(或者它的上級目錄中的一個),則按照從短到長的匹配次序應用指令。2..htaccess文件按父目錄到子目錄的順序應用。3.<Files>和<FileMatch>同時被執行。4.<Location>和<LocationMatch>也同時被執行。先應用虛擬主機外面定義的相應分區和指令,再應用<VirtualHost>分區中的分區和指令。同一時間只有一個<VirtualHost>分區可以應用給請求。較晚的分區優先於較早的那些。3.4正則表達式正則表達式語法指南是Rege++文檔的一部分,由John Maddock博士友情提供,Copyright ?1998-2004,包含在《Boost license》這本書里。完整的語法說明可以在《Boost.Regex documentation》中找到。字面值所的字元都是字面值,除了「.」「*」「?」「+」「(」「)」「{」「}」「[」「]」「^」和「$」。當這些字元由「」前導時也是字面值。一個字面值是個匹配它自己的字元。通配符點字元「.」匹配空字元和換行符以外的任何單個字元。重複重複是被重複任意次數的表達式。一個表達式跟著「*」可以被重複任意次數,包括重複零次。一個表達式跟著「+」可以被重複任意次數,但是至少重複一次。一個表達式跟著「?」可以被只重複零次或者一次。當需要明確指定重複的最低次數和最高次數時,可以用限定運算符「{}」。這樣「a{2}」是字母「a」重複兩次。「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*/tagnames*>"在這種情況下$1將包含標籤對之間的文本,而且是最短的匹配字元串。插入成份插入成分有兩個用處——把項目編組到子表達式中,並且對生成的匹配標號。例如,表達式"(ab)*"將匹配所有的這類字元串"ababab"。所有的被插入成份標號的子匹配將可以用N或者$N語法來回溯引用到。它允許子表達式匹配空字元串,子表達式以1為開始從左往右編號。子表達式0就是整個表達式。正則表達式無標記插入有時候你需要把子表達式編組為插入成份,但是不想為這個插入成分而吐出另一個標記的子表達式。在這種情況下,一個非標記插入(?:)可能有用。例如,下例表達式可以創建一個非子表達式:"(?: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]。其它字元也可以包含在內,這取決於本地環境 |
blank |
所有的空白字元,包含回車或者空格 |
cntrl |
所有的控制字元 |
digit |
從0到9的數字 |
graph |
所有的圖畫字元 |
lower |
所有的小寫字母[a-z],其它的字元也可以包含在內,這取決於本地環境 |
print |
所有的印刷字元 |
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:]
正則表達式
集合元素集合元素一般採用預置聲明內加[.tagname.]的格式。其中tagname既可以是一個單個字元,也可以是一個集合元素名。例如:[[.a.]]等價於[a],[[.comma.]]等價於[,]。ISAPI_Rewrite支持所有的標準POSIX集合元素名,以及下面的這些字元組合:「ae」、「ch」、「ll」、「ss」、「nj」、「dz」、「lj」、任意小寫、大寫、首字母大寫的變化組合。多個字符集合元素可以導致預置匹配一個以上的字元。例如:[[.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.].要在一個預設中包含字面值「-」,請這樣做:使它成為開放的「[」或者「[^」後面的第一個字元、一個系列或者一個集合元素的末點,或者用一個前置的轉義字元如「[-]」。要在一個預設中包含一個字面值「[」或者「]」或者「^」,請把它們作為一個系列或者一個集合元素的末點,或者用一個前置的轉義字元。
行錨錨用來匹配一行開頭或結尾的空串。「^」匹配行開頭的空串,「$」匹配行結尾的空串。
回溯引用回溯引用是引用前面已經被匹配的子表達式。這個引用是被匹配的子表達式,而不是表達式本身。回溯引用包括轉義字元「」跟著一個從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"匹配詞語中的空字元串。
轉義字元轉義字元「」含有多重意義: 轉義字元可以引導一個運算符,例如:回溯引用、詞操作符 轉義字元可以使下面的字元正常,比如說「*」代表一個字面值「*」,而不是重複運算符。
單個字元轉義序列下面的轉義序列是單個字元的別名:
轉義序列 |
字元代碼 |
含義 |
a |
0x07 |
信號鈴記號. |
|
0x09 |
製表符 |
v |
0x0B |
垂直製表符 |
e |
0x1B |
ASCII轉義字元 |
|