Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> 電腦軟件教程 >> 服務器技術 >> 關於服務器 >> Apache中RewriteCond指令詳解

Apache中RewriteCond指令詳解

日期:2017/2/8 10:15:49      編輯:關於服務器

在 Apache中應用mod_rewrite時,我們往往需要對.htaccess文件進行重寫規則的定義,而RewriteCond指令定義了重寫規則生效的條件,即在一個RewriteRule指令之前可以有一個或多個RewriteCond指令。條件之後的重寫規則僅在當前URI與Pattern匹配並且滿足此處的條件時才會起作用。不難發現,RewriteCond指令和PHP中的if語句的條件表達式十分類似。

RewriteCond指令的定義

說明 定義重寫發生的條件 語法 RewriteCond TestString CondPattern [flags] 作用域 server config, virtual host, directory, .htaccess 覆蓋項 FileInfo 狀態 擴展(E) 模塊 mod_rewrite

可以看出,RewriteCond指令定義了重寫規則生效的條件,整個RewriteCond語句的意思就是:某個測試字符串(TestString)如果滿足了條件模式(CondPattern),則進行其後的RewriteRule

RewriteCond指令的TestString

TestString是一個純文本的(測試)字符串,,但是還可以包含下列可擴展的成分:

1,RewriteRule反向引用,引用方法是:

$N(0<= N<= 9)引用當前(帶有若干RewriteRule指令的)RewriteCond中的與Pattern匹配的分組成分(正則表達式中的子模式)。

2,RewriteCond反向引用,引用方法是:

%N(1<= N<=9)引用當前若干RewriteCond條件中最後符合的條件中的分組成分(正則表達式中的子模式)。

3,服務器變量 ,引用方法是:

%{NAME_OF_VARIABLE}

NAME_OF_VARIABLE可以是下表列出的字符串之一:

HTTP頭 連接與請求  

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

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

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規范中都有說明。

RewriteCond指令的condPattern

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

可以在CondPattern串的開頭使用'!'(驚歎號)來指定不匹配。

CondPatterns是一個perl兼容的正則表達式,有若干特殊的變種。除了正則表達式的標准用法,還有下列若干增補用法:

1,'<CondPattern'(詞典順序的小於)將CondPattern視為純字符串,與TestString按詞典順序進行比較。如果TestString小於CondPattern則為真。

2,'>CondPattern'(詞典順序的大於)將CondPattern視為純字符串,與TestString按詞典順序進行比較。如果TestString大於CondPattern則為真。

3,'=CondPattern'(詞典順序的等於)將CondPattern視為純字符串,與TestString按詞典順序進行比較。如果TestString等於 CondPattern(兩個字符串逐個字符地完全相等)則為真。如果CondPattern是""(兩個雙引號),則TestString將與空字符串進行比較。

4,'-d'(目錄)將TestString視為一個路徑名並測試它是否為一個存在的目錄。

5,'-f'(常規文件)將TestString視為一個路徑名並測試它是否為一個存在的常規文件。

6,'-s'(非空的常規文件)將TestString視為一個路徑名並測試它是否為一個存在的、尺寸大於0的常規文件。

7,'-l'(符號連接)將TestString視為一個路徑名並測試它是否為一個存在的符號連接。

8,'-x'(可執行)將TestString視為一個路徑名並測試它是否為一個存在的、具有可執行權限的文件。該權限由操作系統檢測。

9,'-F'(對子請求存在的文件)檢查TestString是否為一個有效的文件,而且可以在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來做檢查,由於會降低服務器的性能,所以請謹慎使用!

10,'-U'(對子請求存在的URL)檢查TestString是否為一個有效的URL,而且可以在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來做檢查,由於會降低服務器的性能,所以請謹慎使用!

注意:所有這些測試都可以用驚歎號作前綴('!')以實現測試條件的反轉,並且還可以在CondPattern之後追加特殊的標記[flags]作為RewriteCond指令的第三個參數。

RewriteCond指令的flags

flags是一個以逗號分隔的以下標記的列表:

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

2,'ornext|OR'(或下一條件):它以OR方式組合若干規則的條件,而不是隱含的AND。

RewriteCond實例

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

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

RewriteCond %{REMOTE_HOST} ^host3.*

RewriteRule ... 針對這3個主機的規則集 ...

Copyright © Windows教程網 All Rights Reserved