mod_rewrite模塊在運行時會使用兩個Hook程序。
第一個是從URL到文件名轉換的Hook。當有訪問到達Apache服務器的時,服務器會確認相應主機(或虛擬主機),這時mod_rewrite模塊就開始工作,它將會先處理服務器全局中mod_rewrite模塊所提供的指令,然后根據用戶提供的指令進行改寫。
第二個是修正URL的Hook。在此階段mod_rewrite模塊會處理非全局的設置。例如,目錄中的.htaccess文件中的設置。但是此時已經完成URL的翻譯(由URL轉換為文件名),因此是無法在次對目錄級別的URL進行改寫操作,但是moe_rewrite模塊會將已翻譯的URL再次轉換為URL的狀態,繼續進行目錄級別的URL改寫。(mod_rewrite模塊將會使用讀后請求階段的回叫函數重新開始一個請求的循環處理)
Rewirte模塊規則集的處理
當mod_rewrite在這兩個API階段中開始執行時,它會讀取配置結構中配置好的 (或者是在服務啟動時建立的服務器級的,或者是在遍歷目錄采集到的目錄級的)規則集,然后,啟動URL重寫引擎來處理(帶有一個或多個條件的)規則集。無論是服務器級的還是目錄級的規則集,都是由同一個URL重寫引擎處理,只是最終結果處理不同而已。
規則集中規則的順序是很重要的,因為重寫引擎是按一種特殊的順序處理的:逐個遍歷每個規則(RewriteRule指令),如果出現一個匹配條件的規則,則可能回頭遍歷已有的規則條件(RewriteCond指令)。由于歷史的原因,條件規則是前置的,所以控制流程略顯冗長,細節見圖
![]()
可見,URL首先與每個規則的Pattern匹配,如果匹配失敗,mod_rewrite將立即終止此規則的處理,繼而處理下一個規則。如果匹配成功,mod_rewrite將尋找相應的規則條件,如果一個條件都沒有,則簡單地用Substitution構造的新值來替換URL,然后繼續處理其他規則;但是如果條件存在,則開始一個內部循環按其列出的順序逐個處理。對規則條件的處理有所不同:URL并不與模式進行匹配,而是首先通過擴展變量、反向引用、查找映射表等步驟建立一個TestString字符串,然后用它來與CondPattern匹配。如果匹配失敗,則整個條件集和對應的規則失敗;如果匹配成功,則執行下一個規則直到所有條件執行完畢。如果所有條件得以匹配,則以Substitution替換URL,并且繼續處理。
![]()
最簡單的重寫指令可以簡單到讓你無法想象!
只需要兩步就可以完成了。第一使用RewriteEngine開啟mod_rewrite模塊功能;第二通過RewriteRule定義URL重寫規則
--------------------------------------------------------------- RewriteEngine on #開啟mod_rewrite模塊功能 RewriteBase 路徑 #基準URL(使用alias設置別名則需使用這個) RewriteCond TestString CondPattern [flags] #重寫條件(可以多個) RewriteRule Pattern Substitution [flags] #重寫規則 ---------------------------------------------------------------- #4、5行可以可以多個 #按順序一個一個執行RewriteRule([flags不終止情況下]) ##以上是常用的指令,還有一些很少見的指令,需要的自己去查資料了解



