在 Apache中應(yīng)用mod_rewrite時(shí),我們往往需要對(duì).htaccess文件進(jìn)行重寫規(guī)則的定義,而RewriteCond指令定義了重寫規(guī)則生效的條件,即在一個(gè)RewriteRule指令之前可以有一個(gè)或多個(gè)RewriteCond指令。條件之后的重寫規(guī)則僅在當(dāng)前URI與Pattern匹配并且滿足此處的條件時(shí)才會(huì)起作用。不難發(fā)現(xiàn),RewriteCond指令和PHP中的if語句的條件表達(dá)式十分類似。
說明 | 定義重寫發(fā)生的條件 |
---|---|
語法 | RewriteCond TestString CondPattern [flags] |
作用域 | server config, virtual host, directory, .htaccess |
覆蓋項(xiàng) | FileInfo |
狀態(tài) | 擴(kuò)展(E) |
模塊 | mod_rewrite |
可以看出,RewriteCond指令定義了重寫規(guī)則生效的條件,整個(gè)RewriteCond語句的意思就是:某個(gè)測(cè)試字符串(TestString)如果滿足了條件模式(CondPattern),則進(jìn)行其后的RewriteRule。
RewriteCond指令的TestString
TestString是一個(gè)純文本的(測(cè)試)字符串,,但是還可以包含下列可擴(kuò)展的成分:
1,RewriteRule反向引用,引用方法是:
$N(0<= N<= 9)引用當(dāng)前(帶有若干RewriteRule指令的)RewriteCond中的與Pattern匹配的分組成分(正則表達(dá)式中的子模式)。
2,RewriteCond反向引用,引用方法是:
%N(1<= N<=9)引用當(dāng)前若干RewriteCond條件中最后符合的條件中的分組成分(正則表達(dá)式中的子模式)。
3,服務(wù)器變量 ,引用方法是:
%{NAME_OF_VARIABLE}
NAME_OF_VARIABLE可以是下表列出的字符串之一:
HTTP頭 | 連接與請(qǐng)求 | |
---|---|---|
HTTP_USER_AGENTHTTP_REFERER HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_ACCEPT | REMOTE_ADDRREMOTE_HOST REMOTE_PORT REMOTE_USER REMOTE_IDENT REQUEST_METHOD SCRIPT_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE | |
服務(wù)器自身 | 日期和時(shí)間 | 其它 |
DOCUMENT_ROOT SERVER_ADMIN SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE | TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME | API_VERSION THE_REQUEST REQUEST_URI REQUEST_FILENAME IS_SUBREQ HTTPS |
這些變量都對(duì)應(yīng)于類似命名的HTTP MIME頭、Apache服務(wù)器的C變量、Unix系統(tǒng)中的struct tm字段,其中的大多數(shù)在其他的手冊(cè)或者CGI規(guī)范中都有說明。
CondPattern是條件模式,即一個(gè)應(yīng)用于當(dāng)前TestString實(shí)例的正則表達(dá)式。TestString將被首先計(jì)算,然后再與CondPattern匹配。
可以在CondPattern串的開頭使用'!'(驚嘆號(hào))來指定不匹配。
CondPatterns是一個(gè)perl兼容的正則表達(dá)式,有若干特殊的變種。除了正則表達(dá)式的標(biāo)準(zhǔn)用法,還有下列若干增補(bǔ)用法:
1,'<CondPattern'(詞典順序的小于)將CondPattern視為純字符串,與TestString按詞典順序進(jìn)行比較。如果TestString小于CondPattern則為真。
2,'>CondPattern'(詞典順序的大于)將CondPattern視為純字符串,與TestString按詞典順序進(jìn)行比較。如果TestString大于CondPattern則為真。
3,'=CondPattern'(詞典順序的等于)將CondPattern視為純字符串,與TestString按詞典順序進(jìn)行比較。如果TestString等于 CondPattern(兩個(gè)字符串逐個(gè)字符地完全相等)則為真。如果CondPattern是""(兩個(gè)雙引號(hào)),則TestString將與空字符串進(jìn)行比較。
4,'-d'(目錄)將TestString視為一個(gè)路徑名并測(cè)試它是否為一個(gè)存在的目錄。
5,'-f'(常規(guī)文件)將TestString視為一個(gè)路徑名并測(cè)試它是否為一個(gè)存在的常規(guī)文件。
6,'-s'(非空的常規(guī)文件)將TestString視為一個(gè)路徑名并測(cè)試它是否為一個(gè)存在的、尺寸大于0的常規(guī)文件。
7,'-l'(符號(hào)連接)將TestString視為一個(gè)路徑名并測(cè)試它是否為一個(gè)存在的符號(hào)連接。
8,'-x'(可執(zhí)行)將TestString視為一個(gè)路徑名并測(cè)試它是否為一個(gè)存在的、具有可執(zhí)行權(quán)限的文件。該權(quán)限由操作系統(tǒng)檢測(cè)。
9,'-F'(對(duì)子請(qǐng)求存在的文件)檢查TestString是否為一個(gè)有效的文件,而且可以在服務(wù)器當(dāng)前的訪問控制配置下被訪問。它使用一個(gè)內(nèi)部子請(qǐng)求來做檢查,由于會(huì)降低服務(wù)器的性能,所以請(qǐng)謹(jǐn)慎使用!
10,'-U'(對(duì)子請(qǐng)求存在的URL)檢查TestString是否為一個(gè)有效的URL,而且可以在服務(wù)器當(dāng)前的訪問控制配置下被訪問。它使用一個(gè)內(nèi)部子請(qǐng)求來做檢查,由于會(huì)降低服務(wù)器的性能,所以請(qǐng)謹(jǐn)慎使用!
注意:所有這些測(cè)試都可以用驚嘆號(hào)作前綴('!')以實(shí)現(xiàn)測(cè)試條件的反轉(zhuǎn),并且還可以在CondPattern之后追加特殊的標(biāo)記[flags]作為RewriteCond指令的第三個(gè)參數(shù)。
flags是一個(gè)以逗號(hào)分隔的以下標(biāo)記的列表:
1,'nocase|NC'(忽略大小寫):它使測(cè)試忽略大小寫,擴(kuò)展后的TestString和CondPattern中'A-Z' 和'a-z'是沒有區(qū)別的。此標(biāo)記僅用于TestString和CondPattern的比較,而對(duì)文件系統(tǒng)和子請(qǐng)求的檢查不起作用。
2,'ornext|OR'(或下一條件):它以O(shè)R方式組合若干規(guī)則的條件,而不是隱含的AND。
RewriteCond實(shí)例
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule ... 針對(duì)這3個(gè)主機(jī)的規(guī)則集 ...
新聞熱點(diǎn)
疑難解答
圖片精選