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