.htaccess 基礎教程(四)Apache RewriteCond 規則參數

Apache模塊 mod_rewrite 提供了一個基於正則表達式分析器的重寫引擎來實時重寫URL請求。它支持每一個完整規則能夠擁有不限數量的子規則以及附加條件規則的靈活並且強大的URL操做機制。此URL操做能夠依賴於各類測試,好比服務器變量、環境變量、HTTP頭、時間標記,甚至各類格式的用於匹配URL組成部分的查找數據庫。html

此模塊能夠操做URL的全部部分(包括路徑信息部分),在服務器級的(httpd.conf)和目錄級的(.htaccess)配置都有效,還能夠生成最終請求字符串。此重寫操做的結果能夠是內部子處理,也能夠是外部請求的轉向,甚至還能夠是內部代理處理。正則表達式

這裏着重介紹一下 RewriteCond 的規則以及參數說明。RewriteCond指令定義了規則生效的條件,即在一個RewriteRule指令以前能夠有一個或多個RewriteCond指令。條件以後的重寫規則僅在當前URI與Pattern匹配而且知足此處的條件(TestString可以與CondPattern匹配)時纔會起做用。數據庫

【說明 】定義重寫發生的條件瀏覽器

【語法】 RewriteCond TestString CondPattern [flags]安全

【做用域】 server config, virtual host, directory, .htaccess服務器

【覆蓋項】 FileInfo性能

【狀態】 擴展(E)測試

【模塊】 mod_rewritespa


TestString是一個純文本的字符串,可是還能夠包含下列可擴展的成分:操作系統

一、RewriteRule反向引用 ,引用方法是:$N (0 <= N <= 9)引用當前(帶有若干RewriteRule指令的)RewriteCond中的與Pattern匹配的分組成分(圓括號!)。

二、RewriteCond反向引用 ,引用方法是:%N (1 <= N <= 9)引用當前若干RewriteCond條件中最後符合的條件中的分組成分(圓括號!)。

三、RewriteMap擴展 ,引用方法是:${mapname:key|default} 細節請參見RewriteMap 指令。

四、服務器變量 ,引用方法是:%{NAME_OF_VARIABLE} NAME_OF_VARIABLE能夠是下表列出的字符串之一:

HTTP頭 鏈接與請求  

HTTP_USER_AGENT

HTTP_REFERER

HTTP_COOKIE

HTTP_FORWARDED

HTTP_HOST

HTTP_PROXY_CONNECTION

HTTP_ACCEPT REMOTE_ADDR

REMOTE_HOST

REMOTE_PORT

REMOTE_USER

REMOTE_IDENT

REQUEST_METHOD

SCRIPT_FILENAME

PATH_INFO

QUERY_STRING

AUTH_TYPE  

服務器自身 日期和時間 其它

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

 

這些變量都對應於相似命名的HTTP MIME頭、Apache服務器的C變量、Unix系統中的struct tm字段,其中的大多數在其餘的手冊或者CGI規範中都有說明。 其中爲mod_rewrite所特有的變量以下:

IS_SUBREQ

若是正在處理的請求是一個子請求,它將包含字符串」true」,不然就是」false」。模塊爲了解析URI中的附加文件,可能會產生子請求。

API_VERSION

這是正在使用中的Apache模塊API(服務器和模塊之間內部接口)的版本, 其定義位於include/ap_mmn.h中。此模塊API版本對應於正在使用的Apache的版本(好比在Apache 1.3.14的發行版中這個值是19990320:10)。 一般,對它感興趣的是模塊的開發者。

THE_REQUEST

這是由瀏覽器發送的完整的HTTP請求行(好比:」GET /index.html HTTP/1.1″)。它不包含任何瀏覽器發送的其它頭信息。

REQUEST_URI

這是在HTTP請求行中所請求的資源(好比上述例子中的」/index.html」)。

REQUEST_FILENAME

這是與請求相匹配的完整的本地文件系統的文件路徑名。

HTTPS

若是鏈接使用了SSL/TLS,它將包含字符串」on」,不然就是」off」(不管mod_ssl是否已經加載,該變量均可以安全的使用)。 

其它注意事項:

一、SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的——即Apache服務器內部的request_rec結構中的filename字段。 第一個就是你們都知道的CGI變量名,而第二個則是REQUEST_URI(request_rec結構中的uri字段)的一個副本。

二、特殊形式:%{ENV:variable} ,其中的variable能夠是任意環境變量。它是經過查找Apache內部結構或者(若是沒找到的話)由Apache服務器進程經過getenv()獲得的。

三、特殊形式:%{SSL:variable} ,其中的variable能夠是一個SSL環境變量的名字,不管mod_ssl模塊是否已經加載均可以使用(未加載時爲空字符串)。好比:%{SSL:SSL_CIPHER_USEKEYSIZE}將會被替換爲128。

四、特殊形式:%{HTTP:header} ,其中的header能夠是任意HTTP MIME頭的名稱。它老是能夠經過查找HTTP請求而獲得。好比:%{HTTP:Proxy-Connection}將被替換爲Proxy-Connection:HTTP頭的值。

五、預設形式:%{LA-U:variable} ,variable的最終值在執行一個內部(基於URL的)子請求後肯定。 當須要使用一個目前未知可是會在以後的過程當中設置的變量的時候,就可使用這個方法。例如,須要在服務器級配置(httpd.conf文件)中根據REMOTE_USER變量進行重寫, 就必須使用%{LA-U:REMOTE_USER}。由於此變量是由URL重寫(mod_rewrite)步驟以後的認證步驟設置的。 可是另外一方面,由於mod_rewrite是經過API修正步驟來實現目錄級(.htaccess文件)配置的, 而認證步驟先於API修正步驟,因此能夠用%{REMOTE_USER}。

六、預設形式:%{LA-F:variable} ,variable的最終值在執行一個內部(基於文件名的)子請求後肯定。 大多數狀況下和上述的LA-U是相同的。

CondPattern是條件模式,即一個應用於當前TestString實例的正則表達式。TestString將被首先計算,而後再與CondPattern匹配。

注意:CondPattern是一個perl兼容的正則表達式,可是還有若干增補:

一、能夠在CondPattern串的開頭使用’!'(驚歎號)來指定不匹配。

二、CondPatterns有若干特殊的變種。除了正則表達式的標準用法,還有下列用法:

 ‘<CondPattern’(詞典順序的小於)

將CondPattern視爲純字符串,與TestString按詞典順序進行比較。若是TestString小於CondPattern則爲真。

‘>CondPattern’(詞典順序的大於)

將CondPattern視爲純字符串,與TestString按詞典順序進行比較。若是TestString大於CondPattern則爲真。

‘=CondPattern’(詞典順序的等於)

將CondPattern視爲純字符串,與TestString按詞典順序進行比較。若是TestString等於CondPattern(兩個字符串逐個字符地徹底相等)則爲真。若是CondPattern是」"(兩個雙引號),則TestString將與空字符串進行比較。

‘-d’(目錄)

將TestString視爲一個路徑名並測試它是否爲一個存在的目錄。

‘-f’(常規文件)

將TestString視爲一個路徑名並測試它是否爲一個存在的常規文件。

‘-s’(非空的常規文件)

將TestString視爲一個路徑名並測試它是否爲一個存在的、尺寸大於0的常規文件。

‘-l’(符號鏈接)

將TestString視爲一個路徑名並測試它是否爲一個存在的符號鏈接。

‘-x’(可執行)

將TestString視爲一個路徑名並測試它是否爲一個存在的、具備可執行權限的文件。該權限由操做系統檢測。

‘-F’(對子請求存在的文件)

檢查TestString是否爲一個有效的文件,並且能夠在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來作檢查,因爲會下降服務器的性能,因此請謹慎使用!

‘-U’(對子請求存在的URL)

檢查TestString是否爲一個有效的URL,並且能夠在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來作檢查,因爲會下降服務器的性能,因此請謹慎使用!

注意:全部這些測試均可以用驚歎號做前綴(‘!’)以實現測試條件的反轉。

三、還能夠在CondPattern以後追加特殊的標記[flags]做爲RewriteCond指令的第三個參數。flags是一個以逗號分隔的如下標記的列表: 

‘nocase|NC’(忽略大小寫)

它使測試忽略大小寫,擴展後的TestString和CondPattern中’A-Z’ 和’a-z’是沒有區別的。此標記僅用於TestString和CondPattern的比較,而對文件系統和子請求的檢查不起做用。

‘ornext|OR’(或下一條件)

它以OR方式組合若干規則的條件,而不是隱含的AND。典型的例子以下:

RewriteCond %{REMOTE_HOST} ^host1.* [OR]

RewriteCond %{REMOTE_HOST} ^host2.* [OR]

RewriteCond %{REMOTE_HOST} ^host3.*

RewriteRule … 針對這3個主機的規則集 …若是不用這個標記,你就必需要書寫三次條件/規則對。

舉例

若是要按請求頭中的」User-Agent:」重寫一個站點的主頁,能夠這樣寫: 

RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*

RewriteRule  ^/$                 /homepage.max.html  [L]

 

RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*

RewriteRule  ^/$                 /homepage.min.html  [L]

 

RewriteRule  ^/$                 /homepage.std.html  [L]

解釋:若是你使用的瀏覽器識別標誌是’Mozilla’,則你將獲得內容最大化的主頁(含有Frames等等)。若是你使用的是(基於終端的)Lynx,則你獲得的是內容最小化的主頁(不含table等等)。若是上述條件都不知足(使用的是其餘瀏覽器),則你獲得的是一個標準的主頁。

相關文章
相關標籤/搜索