htaccess語法之RewriteCond與RewriteRule指令格式詳細(xì)解釋(2012-11-09 18:09:08)
上文htaccess語法詳細(xì)解釋與用例分析中對RewriteCond和RewriteRule的用法進行了舉例分析,本文將詳細(xì)描述上述兩個命令的使用格式,,與所使用的變量和規(guī)則,。這篇文章很長啊哈,請認(rèn)真閱讀,,內(nèi)容都很有用哦,。 RewriteCond指令格式【說明】定義重寫發(fā)生的條件 RewriteCond指令定義一條規(guī)則條件。在一條RewriteRule指令前面可能會有一條或多條RewriteCond指令,,只有當(dāng)RewriteCond的條件(CondPattern)匹配成功時,,RewriteRule的重寫規(guī)則才被應(yīng)用于當(dāng)前URL處理。 TestString是一個純文本的字符串,,除了包含普通的字符外,,還可以包括下列的變量結(jié)構(gòu)擴展:RewriteMap擴展:引用方法是:${mapname:key|default} 細(xì)節(jié)請參見RewriteMap指令 。 TestString可以包含服務(wù)器變量 ,,引用方法是:%{NAME_OF_VARIABLE} NAME_OF_VARIABLE可以是下表列出的字符串之一:
這些變量都對應(yīng)于類似命名的HTTP MIME頭,、Apache服務(wù)器的C變量、Unix系統(tǒng)中的struct tm字段,,其中的大多數(shù)在其他的手冊或者CGI規(guī)范中都有說明,。 其中有mod_rewrite所特有的變量如下: IS_SUBREQ 如果正在處理的請求是一個子請求,它將包含字符串”true”,,否則就是”false”,。 模塊為了解析URI中的附加文件,可能會產(chǎn)生子請求,。 API_VERSION 這是正在使用中的Apache模塊API(服務(wù) 器和模塊之間內(nèi)部接口)的版本,, 其定義位于include/ap_mmn.h中。 此模塊API版本對應(yīng)于正在使用的Apache的版本(比如在Apache 1.3.14的發(fā)行版中這個值是19990320:10),。 通常,,對它感興趣的是模塊的開發(fā)者。 THE_REQUEST 這是由瀏覽器發(fā)送的完整的HTTP請求行(比如:”GET /index.html HTTP/1.1″),。 它不包含任何瀏覽器發(fā)送的其它頭信息,。 REQUEST_URI 這是在HTTP請求行中所請求的資源(比如上述例子中的”/index.html”)。 REQUEST_FILENAME 這是與請求相匹配的完整的本地文件系統(tǒng)的文件路徑名。 HTTPS 如果連接使用了SSL/TLS,,它將包含字符串”on”,,否則就是”off”(無論mod_ssl 是否已經(jīng)加載,該變量都可以安全的使用),。 其它注意事項: SCRIPT_FILENAME和 REQUEST_FILENAME包含的值是相同的——即Apache服務(wù)器內(nèi)部的request_rec結(jié)構(gòu)中的 filename字段,。 第一個就是大家都知道的CGI變量名,而第二個則是REQUEST_URI(request_rec結(jié)構(gòu)中的uri字段)的一個副本,。
●CondPattern是條件模式,,即一個應(yīng)用于當(dāng)前TestString實例的正則表達式。TestString將被首先計算,,然后再與CondPattern匹配,。注意:CondPattern是一個perl兼容的正則表達式,但是還有若干增補: 1、可以在CondPattern串的開頭使用”!’(驚嘆號)來指定 不匹配 ,。 “ 將CondPattern視為純字符串,,與TestString按詞典順序進行比較。 如果TestString小于CondPattern則為真,。 將CondPattern視為純字符串,,與TestString按詞典順序進行比較。 如果TestString大于CondPattern則為真,。 將CondPattern視為純字符串,,與TestString按詞典順序進行比較。 如果TestString等于CondPattern(兩個字符串逐個字符地完全相等)則為真,。 如果CondPattern是”"—(兩個雙引號),,則TestString將與空字符串進行比較。 將TestString視為一個路徑名并測試它是否為一個存在的目錄,。 將TestString視為一個路徑名并測試它是否為一個存在的常規(guī)文件,。 將TestString視為一個路徑名并測試它是否為一個存在的、尺寸大于0的常規(guī)文件,。 將TestString視為一個路徑名并測試它是否為一個存在的符號連接,。 將TestString視為一個路徑名并測試它是否為一個存在的、具有可執(zhí)行權(quán)限的文件,。 該權(quán)限由操作系統(tǒng)檢測,。 檢查TestString是否為一個有效的文件,而且可以在服務(wù)器當(dāng)前的訪問控制配置下被訪問,。 它使用一個內(nèi)部子請求來做檢查,,由于會降低服務(wù)器的性能,所以請謹(jǐn)慎使用,! 檢查TestString是否為一個有效的URL,,而且可以在服務(wù)器當(dāng)前的訪問控制配置下被訪問。 它使用一個內(nèi)部子請求來做檢查,,由于會降低服務(wù)器的性能,,所以請謹(jǐn)慎使用! ●在CondPattern之后追加特殊的標(biāo)記[flags] 作為RewriteCond指令的第三個參數(shù),。flags是一個以逗號分隔的以下標(biāo)記的列表:“nocase|NC”—————(忽略大小寫) 它使測試忽略大小寫,擴展后的TestString和CondPattern中’AZ’ 和’a-z’是沒有區(qū)別的,。 此標(biāo)記僅用于TestString和CondPattern的比較,,而對文件系統(tǒng)和子請求的檢查不起作用。
redirect|R [=code] (強制重定向 redirect) 以 http://thishost[:thisport]/(使新的URL成為一個URI) 為前綴的Substitution可以強制性執(zhí)行一個外部重定向。 如果code沒有指定,,則產(chǎn)生一個HTTP響應(yīng)代碼302(臨時性移動),。 如果需要使用在300-400范圍內(nèi)的其他響應(yīng)代碼,只需在此指定這個數(shù)值即可,, 另外,,還可以使用下列符號名稱之一: temp (默認(rèn)的), permanent, seeother. 用它可以把規(guī)范化的URL反饋給客戶端,如, 重寫“/~”為 “/u/”,,或?qū)?u/user加上斜杠,,等等。 注意: 在使用這個標(biāo)記時,,必須確保該替換字段是一個有效的URL! 否則,,它會指向一個無效的位置! 并且要記住,此標(biāo)記本身只是對URL加上 http://thishost[:thisport]/的前綴,,重寫操作仍然會繼續(xù),。 通常,你會希望停止重寫操作而立即重定向,,則還需要使用’L’標(biāo)記. forbidden|F (強制URL為被禁止的 forbidden) 強制當(dāng)前URL為被禁止的,,即,立即反饋一個HTTP響應(yīng)代碼403(被禁止的),。 使用這個標(biāo)記,,可以鏈接若干RewriteConds以有條件地阻塞某些URL。 gone|G’(強制URL為已廢棄的 gone) 強制當(dāng)前URL為已廢棄的,,即,,立即反饋一個HTTP響應(yīng)代碼410(已廢棄的)。 使用這個標(biāo)記,,可以標(biāo)明頁面已經(jīng)被廢棄而不存在了. proxy|P (強制為代理 proxy) 此標(biāo)記使替換成分被內(nèi)部地強制為代理請求,,并立 即(即, 重寫規(guī)則處理立即中斷)把處理移交給代理模塊,。 你必須確保此替換串是一個有效的(比如常見的以 http://hostname開頭的)能夠為Apache代理模塊所處理的URI。 使用這個標(biāo)記,可以把某些遠程成分映射到本地服務(wù)器名稱空間,, 從而增強了ProxyPass指令的功能,。 注意: 要使用這個功能,代理模塊必須編譯在Apache服務(wù)器中,。 如果你不能確定,,可以檢查“httpd -l”的輸出中是否有mod_proxy.c。 如果有,,則mod_rewrite可以使用這個功能,; 如果沒有,則必須啟用mod_proxy并重新編譯“httpd”程序,。 last|L (最后一個規(guī)則 last) 立即停止重寫操作,,并不再應(yīng)用其他重寫規(guī)則。 它對應(yīng)于Perl中的last命令或C語言中的break命令,。 這個標(biāo)記可以阻止當(dāng)前已被重寫的URL為其后繼的規(guī)則所重寫,。 舉例,使用它可以重寫根路徑的URL(’/’)為實際存在的URL, 比如, ‘/e/www/’. next|N (重新執(zhí)行 next round) 重新執(zhí)行重寫操作(從第一個規(guī)則重新開始). 這時再次進行處理的URL已經(jīng)不是原始的URL了,,而是經(jīng)最后一個重寫規(guī)則處理的URL,。 它對應(yīng)于Perl中的next命令或C語言中的continue命令。 此標(biāo)記可以重新開始重寫操作,,即, 立即回到循環(huán)的頭部,。 chain|C (與下一個規(guī)則相鏈接 chained) 此標(biāo)記使當(dāng)前規(guī)則與下一個(其本身又可以與其后 繼規(guī)則相鏈接的,, 并可以如此反復(fù)的)規(guī)則相鏈接,。 它產(chǎn)生這樣一個效果: 如果一個規(guī)則被匹配,通常會繼續(xù)處理其后繼規(guī)則,, 即,,這個標(biāo)記不起作用;如果規(guī)則不能被匹配,, 則其后繼的鏈接的規(guī)則會被忽略,。比如,在執(zhí)行一個外部重定向時,, 對一個目錄級規(guī)則集,,你可能需要刪除“.www” (此處不應(yīng)該出現(xiàn)“.www”的)。 type|T=MIME-type(強制MIME類型 type) 強制目標(biāo)文件的MIME類型為MIME-type,。 比如,,它可以用于模擬mod_alias中的ScriptAlias指令, 以內(nèi)部地強制被映射目錄中的所有文件的MIME類型為“application/x-httpd-cgi”,。 nosubreq|NS (僅用于不對內(nèi)部子請求進行處理 no internal sub-request) 在當(dāng)前請求是一個內(nèi)部子請求時,,此標(biāo)記強制重寫 引擎跳過該重寫規(guī)則,。 比如,在mod_include試圖搜索可能的目錄默認(rèn)文件(index.xxx)時,, Apache會內(nèi)部地產(chǎn)生子請求,。對子請求,它不一定有用的,,而且如果整個規(guī)則集都起作用,, 它甚至可能會引發(fā)錯誤。所以,,可以用這個標(biāo)記來排除某些規(guī)則,。 根據(jù)你的需要遵循以下原則: 如果你使用了有CGI腳本的URL前綴,以強制它們由CGI腳本處理,, 而對子請求處理的出錯率(或者開銷)很高,,在這種情況下,可以使用這個標(biāo)記,。 nocase|NC (忽略大小寫 no case) 它使Pattern忽略大小寫,,即, 在Pattern與當(dāng)前URL匹配時,’A-Z’ 和’a-z’沒有區(qū)別,。 qsappend|QSA (追加請求串 query string append) 此標(biāo)記強制重寫引擎在已有的替換串中追加一個請求串,,而不是簡單的替換。 如果需要通過重寫規(guī)則在請求串中增加信息,,就可以使用這個標(biāo)記,。 noescape|NE (在輸出中不對URI作轉(zhuǎn)義 no URI escaping) 此標(biāo)記阻止mod_rewrite對重寫結(jié)果應(yīng)用常規(guī)的URI轉(zhuǎn)義規(guī)則。 一般情況下,,特殊字符(如’%’, ‘$’, ‘;’等)會被轉(zhuǎn)義為等值的十六進制編碼,。 此標(biāo)記可以阻止這樣的轉(zhuǎn)義,以允許百分號等符號出現(xiàn)在輸出中,,如: RewriteRule /foo/(.*) /bar?arg=P1\=$1 [R,NE] 可以使’/foo/zed’轉(zhuǎn)向到一個安全的請求’/bar?arg=P1=zed’. passthrough|PT (移交給下一個處理器 pass through) 此標(biāo)記強制重寫引擎將內(nèi)部結(jié)構(gòu) request_rec中的uri字段設(shè)置為 filename字段的值,,它只是一個小修改,使之能對來自其他URI到文件名翻譯器的 Alias,,ScriptAlias, Redirect 等指令的輸出進行后續(xù)處理,。舉一個能說明其含義的例子: 如果要通過mod_rewrite的重寫引擎重寫/abc為/def, 然后通過mod_alias使/def轉(zhuǎn)變?yōu)?ghi,,可以這樣: RewriteRule ^/abc(.*) /def$1 [PT]Alias /def /ghi 如果省略了PT標(biāo)記,,雖然mod_rewrite運作正常, 即, 作為一個使用API的URI到文件名翻譯器,, 它可以重寫uri=/abc/…為filename=/def/…,, 但是,后續(xù)的mod_alias在試圖作URI到文件名的翻譯時,,則會失效,。 注意: 如果需要混合使用不同的包含URI到文件名翻譯器的模塊時,, 就必須使用這個標(biāo)記。,。 混合使用mod_alias和mod_rewrite就是個典型的例子,。 For Apache 如果當(dāng)前Apache API除了URI到文件名hook之外,還有一個文件名到文件名的hook,, 就不需要這個標(biāo)記了! 但是,如果沒有這樣一個hook,,則此標(biāo)記是唯一的解決方案,。 Apache Group討論過這個問題,并在Apache 2.0 版本中會增加這樣一個hook,。 skip|S=num (跳過后繼的規(guī)則 skip) 此標(biāo)記強制重寫引擎跳過當(dāng)前匹配規(guī)則后繼的num個規(guī)則,。 它可以實現(xiàn)一個偽if-then-else的構(gòu)造: 最后一個規(guī)則是then從句,而被跳過的skip=N個規(guī)則是else從句. (它和’chain|C’標(biāo)記是不同的!) env|E=VAR:VAL (設(shè)置環(huán)境變量 environment variable) 此標(biāo)記使環(huán)境變量VAR的值為VAL, VAL可以包含可擴展的反向引用的正則表達式$N和%N,。 此標(biāo)記可以多次使用以設(shè)置多個變量,。 這些變量可以在其后許多情況下被間接引用,但通常是在XSSI (via cookie|CO=NAME:VAL:domain[:lifetime[:path]] (設(shè)置cookie) 它在客戶端瀏覽器上設(shè)置一個cookie,。 cookie的名稱是NAME,,其值是VAL。 domain字段是該cookie的域,,比如’.apache.org’, 可選的lifetime是cookie生命期的分鐘數(shù),, 可選的path是cookie的路徑。 ●舉例說明RewriteCond命令規(guī)則
RewriteRule指令格式【說明】定義重寫的規(guī)則 RewriteRule指令,可以定義一條重寫 規(guī)則,,規(guī)則間的順序非常重要,。對Apache1.2及以后的版本,模板(Pattern)是一個POSIX正則式,,用以匹配當(dāng)前的URL,。當(dāng)前的URL不 一定是最初提交的URL,因為可能用一些規(guī)則在此規(guī)則前已經(jīng)對URL進行了處理,。rewritePattern 大多數(shù)文章寫為Substitution ,,這里為了更清楚的認(rèn)識故寫為rewritePattern 。 ●Pattern 可以使用如下特殊匹配規(guī)則,,如php等其他語言類似,。“.” ——————- 換行符以外的所有字符 rewritePattern 是針對Pattern 匹配后的URL進行rewritePattern 規(guī)定的替換,。應(yīng)用替換時,前面Pattern 第一個()中匹配的內(nèi)容后面rewritePattern 就可以用$1引用,,第二個()中匹配的就用$2應(yīng)用……以此類推,。 ●在rewritePattern 之后追加特殊的標(biāo)記[flags] 作為RewriteRule 指令的第三個參數(shù)。flags可以使用的標(biāo)記,,和上面RewriteCond使用的一樣,。●舉例說明RewriteRule語法
|
|