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