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