Apache htaccess 中的RewriteCond 規則介紹 (轉)

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

此模塊可以操作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_rewrite
TestString是一個純文本的字符串,但是還可以包含下列可擴展的成分:
RewriteRule反向引用 ,引用方法是:N(0<=N<=9)(RewriteRule)RewriteCondPattern(!)RewriteCondRewriteMap {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兼容的正則表達式,但是還有若干增補:
1、可以在CondPattern串的開頭使用’!’(驚歎號)來指定 不匹配 。
2、CondPatterns有若干特殊的變種。 除了正則表達式的標準用法,還有下列用法:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章