<-
Apache > HTTP Server > 文件 > 版本 2.4 > 模組

Apache 模組 mod_rewrite

可用語言:  en  |  fr 

說明提供一個基於規則的改寫引擎,用於即時改寫請求的 URL
狀態延伸模組
模組識別碼rewrite_module
原始檔mod_rewrite.c

摘要

mod_rewrite 模組使用基於 PCRE 正規表示式分析器的、基於規則的改寫引擎,用於即時改寫請求的 URL。預設情況下,mod_rewrite 會將 URL 對應至檔案系統路徑。不過,它也可以用來將某個 URL 重新導向至另一個 URL,或呼叫內部代理擷取。

mod_rewrite 提供一種彈性強大且有效率的方式,可以使用無限數量的規則來處理 URL。每個規則都可以附加無限數量的規則條件,讓你可以根據伺服器變數、環境變數、HTTP 標頭或時間戳記來改寫 URL。

mod_rewrite 運作於完整的 URL 路徑,包括路徑資訊區段。可以在 httpd.conf.htaccess 中呼叫改寫規則。改寫規則所產生的路徑可以包括查詢字串,或導致內部分處理、外部請求重新導向或內部代理傳輸。

mod_rewrite 詳細文件中提供了進一步的詳細資訊、討論和範例。

Support Apache!

主題

指令

修正清單

另請參閱

top

記錄

mod_rewrite 提供從 trace1trace8 記錄層級的動作詳細記錄。記錄層級可以使用 LogLevel 指示,專門為 mod_rewrite 設定:在 debug 層級以前,沒有任何動作記錄,而 trace8 表示實際上已記錄所有動作。

mod_rewrite 使用較高追蹤記錄層級,會大幅降低 Apache HTTP Server 的執行速度!只有在除錯時,才將記錄層級設為高於 trace2

範例

LogLevel alert rewrite:trace3

RewriteLog

熟悉早期 mod_rewrite 版本的人,無疑會尋找 RewriteLogRewriteLogLevel 指示。此功能已完全由上文所述的新模組記錄組態取代。

僅取得特定於 mod_rewrite 的記錄訊息,必須透過 grep 管線記錄檔

tail -f error_log|fgrep '[rewrite:'

top

RewriteBase 指示

說明設定每個目錄改寫的基本 URL
語法RewriteBase URL 路徑
預設
內容目錄、.htaccess
覆寫FileInfo
狀態延伸模組
模組mod_rewrite

RewriteBase 指示指定 URL 前置字首,將用於每個目錄 (htaccess) RewriteRule 指示,以替換相對路徑。

在每個目錄 (htaccess) 內容中於替換中使用相對路徑時,如果下列任一條件為真,這個指示必需使用

在下列範例中,RewriteBase 是必要的,以避免改寫成 http://example.com/opt/myapp-1.2.3/welcome.html,因為資源並非相對於文件根目錄。系統會將此錯誤組態視為在文件根目錄底下尋找「opt」目錄。

DocumentRoot "/var/www/example.com"
AliasMatch "^/myapp" "/opt/myapp-1.2.3"
<Directory "/opt/myapp-1.2.3">
    RewriteEngine On
    RewriteBase "/myapp/"
    RewriteRule "^index\.html$"  "welcome.html"
</Directory>
top

RewriteCond 指示

說明定義執行改寫的條件
語法RewriteCond 測試字串 條件樣式 [旗標]
內容伺服器組態、虛擬主機、目錄、.htaccess
覆寫FileInfo
狀態延伸模組
模組mod_rewrite

RewriteCond 指令定義規則條件。可以在 RewriteRule 指令之前,輸入一個或多個 RewriteCond。只有當目前 URI 的狀態符合其 wzor樣時才會使用下列規則,同時符合這些條件時。

TestString 是可以包含下列展開建構的字串,除了純文字之外

如果 TestString 具有特殊值 expr,則 CondPattern 會視為 ap_expr。如果未提供 novary 旗標,則在指令中參照的 HTTP 標頭將會新增到 Vary 標頭。

您應該了解的其他事項

  1. SCRIPT_FILENAME 和 REQUEST_FILENAME 變數包含相同的值,也就是 Apache HTTP Server 內部 request_rec 結構之 filename 欄位的數值。第一個名稱為常見的 CGI 變數名稱,而第二個名稱是 REQUEST_URI 的適當對應名稱(其中包含 request_recuri 欄位的數值)。

    如果進行取代且重寫繼續進行,這兩個變數的值都將適當地更新。

    如果在伺服器內文函脈絡中使用(例如,在請求被映射到檔案系統之前),SCRIPT_FILENAME 和 REQUEST_FILENAME 不能包含完整的本地檔案系統路徑,因為在處理的這個階段路徑是未知的。但在這種情況下,這兩個變數一開始會包含 REQUEST_URI 的值。要取得在伺服器內文函脈絡中請求的完整本地檔案系統路徑,請使用基於網址的前瞻 `%{LA-U:REQUEST_FILENAME}` 來決定 REQUEST_FILENAME 的最終值。

  2. %{ENV:variable},其中 variable 可以是任何環境變數,也可使用。這是透過內部 Apache httpd 結構查詢的,如果在其中找不到,則會透過 Apache httpd 伺服器程序的 `getenv()` 查詢。
  3. %{SSL:variable},其中 variableSSL 環境變數 的名稱,可以在載入 mod_ssl 時或未載入時使用,但如果未載入時,通常會擴充為空字串。範例:%{SSL:SSL_CIPHER_USEKEYSIZE} 可能會擴充為 128。即使未設定 SSLOptions 指令的 StdEnvVars 選項,也可以使用這些變數。
  4. %{HTTP:header},其中 header 可以是任何 HTTP MIME 標題名稱,可以隨時用來取得在 HTTP 請求中送出的標題值。範例:%{HTTP:Proxy-Connection} 是 HTTP 標題 ``Proxy-Connection:'' 的值。

    如果在條件中使用了 HTTP 標題,在條件針對請求評估為 true 時,此標題會加入回應的 Vary 標題中。如果條件針對請求評估為 false,則會加入標題。將 HTTP 標題加入回應的 Vary 標題是正確快取所需的。

    必須記住,對 'ornext|OR' 旗標而言,條件會遵循短路邏輯,因此某些條件可能不會被評估。

  5. %{LA-U:variable} 可用於前瞻,前瞻會執行內部(基於網址)子請求來決定 variable 的最終值。這可以用於存取改寫變數,該變數在當前階段不可用,但會在稍後階段設定。

    例如,若要根據伺服器內文函脈絡(httpd.conf 檔)中的 REMOTE_USER 變數進行改寫,您必須使用 %{LA-U:REMOTE_USER} ― 此變數由授權階段設定,而授權階段會在網址翻譯階段(mod_rewrite 會在該階段運作)之後執行。

    另一方面,因為 mod_rewrite 透過 API 的 Fixup 階段來實作其伺服器內文函脈絡(.htaccess 檔),而且因為授權階段會在這個階段之前執行,所以您可以在該脈絡中使用 %{REMOTE_USER}

  6. %{LA-F:變數} 可用於執行內部(基於檔案名稱)的子請求,以決定變數的最終值。大多數情況下,這與上述的 LA-U 相同。

CondPattern 是條件模式,一種套用於 TestString 當前個體的正規表示式。在與 CondPattern 比對之前,會先評估 TestString

CondPattern 通常是 與 perl 相容的正規表示式,但有額外的語法可用於對 Teststring 執行其他有用的測試

  1. 可以為模式字串加上一個前置的 !' 字元(驚嘆號)來否定條件的結果,不論使用的是何種類型的 CondPattern
  2. 可以執行字串比對
    <CondPattern
    字元較早
    CondPattern 視為一般字串,並將其以字元方式與 TestString 比對。如果 TestString 字元較早於 CondPattern,則為 True。
    >CondPattern
    字元較後
    CondPattern 視為一般字串,並將其以字元方式與 TestString 比對。如果 TestString 字元較晚於 CondPattern,則為 True。
    =CondPattern
    字元相等
    CondPattern 視為一般字串,並將其以字元方式與 TestString 比對。如果 TestString 字元與 CondPattern 相同(兩個字串的字元完全相等),則為 True。如果 CondPattern"" (兩個引號),這會將 TestString 與空字串進行比對。
    <=CondPattern
    字元小於或等於
    CondPattern 視為一般字串,並將其以字元方式與 TestString 比對。如果 TestString 字元較早於 CondPattern,或與 CondPattern 相同(兩個字串相等),則為 True。
    >=CondPattern
    字元大於或等於
    CondPattern 視為一般字串,並將其以字元方式與 TestString 比對。如果 TestString 字元較晚於 CondPattern,或與 CondPattern 相同(兩個字串相等),則為 True。

    注釋

    字串比對運算子是 CondPattern 參數的一部分,如果使用引號,則必須將其包含在引號中。例如。
    RewriteCond %{HTTP_USER_AGENT} "=This Robot/1.0"
  3. 可以執行整數比對
    -eq
    數值
    TestString 視為整數,並將其與 CondPattern 以數字進行比對。如果兩者數值相等,則為 True。
    -ge
    數值於或
    TestString 視為整數,並將其與 CondPattern 以數字進行比對。如果 TestString 數值大於或等於 CondPattern,則為 True。
    -gt
    數值
    TestString 視為整數,並將其與 CondPattern 以數字進行比對。如果 TestString 數值大於 CondPattern,則為 True。
    -le
    數值上於或等於
    TestString 被視為一個整數,並在數學上與 CondPattern 比較。如果 TestString 在數值上小於或等於 CondPattern,則為 True。使用 -L-h 變異,可以避免與 -l 混淆。
    -lt
    數值上小於
    TestString 被視為一個整數,並在數學上與 CondPattern 比較。如果 TestString 在數值上小於 CondPattern,則為 True。使用 -L-h 變異,可以避免與 -l 混淆。
    -ne
    數值上等於
    TestString 被視為一個整數,並在數學上與 CondPattern 比較。如果兩者在數值上相異,則為 True。這等同於 !-eq
  4. 您可以執行各種檔案屬性測試
    -d
    directory。
    TestString 視為路徑名稱,並測試其是否存在,且為一個目錄。
    -f
    正規的file。
    TestString 視為路徑名稱,並測試其是否存在,且為一個正規檔案。
    -F
    經由子請求在的檔案。
    檢查 TestString 是否為一個有效的檔案,且可經由伺服器當前為該路徑所設定的所有存取控制而存取。這會使用內部子請求來執行檢查,因此請小心使用,這可能會影響伺服器的效能!
    -h
    符號連結,bash 慣例。
    -l
    -l
    符號link。
    TestString 視為路徑名稱,並測試其是否存在,且為一個符號連結。如果可能造成混淆(例如當使用 -lt-le 測試時),也可以使用 bash 慣例的 -L-h
    -L
    符號連結,bash 慣例。
    -l
    -s
    正規檔案,有size。
    TestString 視為路徑名稱,並測試其是否存在,且為一個大於 0 的正規檔案。
    -U

    經由子請求存在的 URL。
    檢查 TestString 是否為一個有效的 URL,且可經由伺服器當前為該路徑所設定的所有存取控制而存取。這會使用內部子請求來執行檢查,因此請小心使用,這可能會影響伺服器的效能!

    此標記會傳回有關存取控制、驗證和授權等事項的資訊。此標記不會傳回已設定的處理常式 (例如靜態檔案、CGI、代理伺服器等) 所會傳回的狀態碼的資訊。

    -x
    擁有可xec utable 的權限。
    TestString 視為一個路徑名稱,並測試其是否存在,且具有可執行權限。這些權限取決於底層 OS。
    例如
    RewriteCond /var/www/%{REQUEST_URI} !-f
    RewriteRule ^(.+) /other/archive/$1 [R]
  5. 如果 TestString 有特殊值 expr,則 CondPattern 會被視為 ap_expr

    在下列範例中,-strmatch 用來比對 REFERER 與網站主機名稱,用來阻擋不需要的熱連結。

    RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
    RewriteRule "^/images" "-" [F]

您也可以為 CondPattern 設定特殊旗標,方法是將 [flags] 附加為 RewriteCond 指令的第三個引數,其中 flags 是逗號分隔的任何下列旗標

  • 'nocase|NC' (no case)
    這會讓測試不分大小寫 - 忽略展開的 TestStringCondPattern 中「A-Z」和「a-z」的差異。此旗標僅對 TestStringCondPattern 之間的比較有用。對檔案系統和子請求檢查沒有影響。
  • 'ornext|OR' (or next condition)
    使用此方法來結合規則條件與本地的 OR,而不是隱含的 AND。典型的範例
    RewriteCond "%{REMOTE_HOST}"  "^host1"  [OR]
    RewriteCond "%{REMOTE_HOST}"  "^host2"  [OR]
    RewriteCond "%{REMOTE_HOST}"  "^host3"
    RewriteRule ...some special stuff for any of these hosts...
    沒有此旗標,則必須寫條件/規則配對三次。
  • 'novary|NV' (no vary)
    如果條件中使用了 HTTP 標頭,此旗標可防止此標頭新增至回應的 Vary 標頭。
    如果回應的呈現會根據此標頭的值而有所不同,使用此旗標可能會損壞回應的適當快取。因此,只有在了解 Vary 標頭的意義時才應使用此旗標。

範例

若要根據請求的 ``User-Agent:'' 標頭改寫網站的首頁,您可以使用下列內容

RewriteCond  "%{HTTP_USER_AGENT}"  "(iPhone|Blackberry|Android)"
RewriteRule  "^/$"                 "/homepage.mobile.html"  [L]

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

說明:如果您使用的瀏覽器標示為行動裝置瀏覽器(請注意,範例並不完整,因為還有許多其他行動裝置平台),就會提供行動版首頁。否則,會提供標準頁面。

預設情況下,多個 RewriteCond 會按順序評估,並暗示邏輯 AND。如果條件失敗,沒有 OR 旗標,則整個規則組會中斷,且不會評估進一步的條件。

top

RewriteEngine 指令

說明啟用或停用執行時期改寫引擎
語法RewriteEngine on|off
預設RewriteEngine off
內容伺服器組態、虛擬主機、目錄、.htaccess
覆寫FileInfo
狀態延伸模組
模組mod_rewrite

RewriteEngine 指令會啟用或停用執行時期改寫引擎。如果設為 off,這個模組完全不執行執行時期處理。它甚至不更新 SCRIPT_URx 環境變數。

在特定情境中,請使用此指令來停用規則,而不是註解掉所有 RewriteRule 指令。

請注意,虛擬主機不會繼承重寫設定。這表示在希望使用重寫規則的每個虛擬主機都必須提供 RewriteEngine on 指令。

當在未設定 RewriteEngineon 的內容中定義時,prg 類型的 RewriteMap 指令不會在伺服器初始化期間啟動

top

RewriteMap 指令

說明定義供尋找鍵資料的比對函式
語法RewriteMap MapName MapType:MapSource [MapTypeOptions]
內容伺服器設定、虛擬主機
狀態延伸模組
模組mod_rewrite
相容性第三個參數 MapTypeOptions 僅於 Apache 2.4.29 以上版本中提供

RewriteMap 指令定義一個 重寫對應,可透過尋找函式,在規則取代字串中使用,將欄位透過鍵值尋找方式插入/取代。這個尋找的來源可以是多種不同的類型。

MapName 是對應的名稱,並會用於透過下列其中一種建構方式,指定重寫規則取代字串的尋找函式

${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }

當此類建構方式發生時,將會諮詢對應 MapName 並尋找鍵 LookupKey。如果找到鍵,則將尋找函式的建構方式取代為 SubstValue。如果找不到鍵,則將取代為 DefaultValue,或是如果沒有指定 DefaultValue,則會取代為空白字串。空白值會表現得像是鍵不存在,因此無法區別空白值的鍵與不存在的鍵。

舉例來說,你可以定義一個 RewriteMap

RewriteMap examplemap "txt:/path/to/file/map.txt"

接下來,你可以像下面這樣,在 RewriteRule 中使用這個對應

RewriteRule "^/ex/(.*)" "${examplemap:$1}"

MapTypeOptions 引數的意義取決於特定的 MapType。請參閱 使用 RewriteMap 以取得更多資訊。

MapTypeMapSource 可使用下列組合

txt
包含空格分隔的鍵/值對的純文字檔案,每一行一組。(詳細資料 ...)
rnd
從純文字檔中隨機選取一筆記錄 (詳細資料 ...)
dbm
在 dbm 檔中尋找一筆記錄,其中包含名稱、值對。雜湊是使用 httxt2dbm 工具從純文字檔格式建立的。(詳細資料 ...)
int
RewriteMap 提供的四個可用內部函式之一:toupper、tolower、escape 或 unescape。(詳細資料 ...)
prg
呼叫外部程式或腳本來處理重寫。(詳細資料 ...)
dbd 或 fastdbd
要執行用於查找重寫目標的 SQL SELECT 敘述。(詳細資料...

可以在 RewriteMap HowTo 中找到更多詳細資料和大量範例

top

RewriteOptions 指令

說明設定重寫引擎的一些特殊選項
語法RewriteOptions 選項
內容伺服器組態、虛擬主機、目錄、.htaccess
覆寫FileInfo
狀態延伸模組
模組mod_rewrite

RewriteOptions 指令設定目前每個伺服器或每個目錄組態的一些特殊選項。選項字串目前只能是下列其中一個

Inherit

這會強制目前的組態繼承父項組態。在每個虛擬伺服器內文中,這表示會繼承主伺服器的映射、條件和規則。在每個目錄內文中,這表示會繼承父目錄的 .htaccess 組態或 <Directory> 區段的條件和規則。繼承的規則會虛擬複製到使用這個指令的區段中。如果與本機規則結合使用,則會在繼承的規則後面複製本機規則。這個指令的位置(位於本機規則的下方或上方)不會影響這種行為。如果本機規則強制停止重寫,則不會處理繼承的規則。

從父範圍繼承的規則會在子範圍中指定的規則之後套用。
InheritBefore

如同上方的 Inherit,不過父範圍的規則會在子範圍中指定的規則之前套用。
在 Apache HTTP Server 2.3.10 及更新版本中可以使用。

InheritDown

如果啟用這個選項,則所有子組態都會繼承目前組態的組態。這和在所有子組態中指定 RewriteOptions Inherit 一樣。請參閱 Inherit 選項,深入瞭解父項子項關係的處理方式。
在 Apache HTTP Server 2.4.8 及更新版本中可以使用。

InheritDownBefore

如同上方的 InheritDown,不過目前範圍的規則會在子範圍中指定的規則之前套用。
在 Apache HTTP Server 2.4.8 及更新版本中可以使用。

IgnoreInherit

這個選項會強制目前的組態和子組態忽略將從指定 InheritDownInheritDownBefore 的父項繼承的所有規則。
在 Apache HTTP Server 2.4.8 及更新版本中可以使用。

AllowNoSlash

預設上,mod_rewrite 會忽略映射到磁碟上目錄但缺乏尾斜線的 URL,並期望 mod_dir 模組會向客戶端發出重新導向,提供具有尾斜線的正規網址。

DirectorySlash 指令設定為停用時,可以啟用 AllowNoSlash 選項,以確保不再忽視改寫規則。此選項可以套用改寫規則在 .htaccess 檔案中,以符合目錄而沒有尾隨斜線(如果需要的話)。
可在 Apache HTTP Server 2.4.0 及更高版本中使用。

AllowAnyURI

RewriteRule 使用於 VirtualHost 或伺服器內容,並在 httpd 2.2.22 或更高版本時,mod_rewrite 僅會處理改寫規則,如果要求 URI 是 URL 路徑。這可以避免特定規則可能會允許「令人驚訝的」模式擴充,來避免一些安全性問題(請參閱 CVE-2011-3368CVE-2011-4317)。若要解除符合 URL 路徑的限制,可以啟用 AllowAnyURI 選項,而 mod_rewrite 會將規則設定套用至任何要求 URI 字串,不論那個字串是否符合 HTTP 規範所需的 URL 路徑語法。
可在 Apache HTTP Server 2.4.3 及更高版本中使用。

安全性警告

啟用此選項將會使伺服器容易受到安全性問題影響,如果使用於未仔細撰寫的改寫規則。強烈建議不要使用此選項。特別是,當心輸入字串包含「@」字元,根據上述 CVE 名稱,這可能會改變轉換的 URI 詮釋。

MergeBase

有了此選項,RewriteBase 的值將會從其明確定義,複製到任何沒有定義其自身 RewriteBase 的子目錄或次要位置。這是在 2.4.0 到 2.4.3 間的預設行為,而還原至它的旗標則可在 Apache HTTP Server 2.4.4 及更高版本中使用。

IgnoreContextInfo

當在目錄(htaccess)內容中製作相關替換,且尚未設定 RewriteBase 時,此模組會使用一些延伸的 URL 及檔案系統內容資料,將相關替換改回成一個 URL。例如 mod_userdirmod_alias 這些模組提供此延伸的內容資料。可在 2.4.16 及更高版本中使用。

LegacyPrefixDocRoot

在 2.4.26 之前,如果替換是與目前的虛擬主機相符合的絕對 URL,此 URL 可能會先縮減到一個 URL 路徑,之後再縮減到一個本機路徑。由於 URL 可以縮減到一個本機路徑,路徑應加上文件根目錄的前置詞。這樣可以防止以以下 RewriteRule 對 http://host/file/myfile 提出要求時,可以存取到 /tmp/myfile 這個檔案。

RewriteRule /file/(.*) https://127.0.0.1/tmp/$1

這個選項讓可用的舊行為得以使用,在這個舊行為裡,Document Root 並沒有加上粗體字的 Local 路徑,而這個 Local 路徑會從 URL 裡削減。現用於 2.4.26 及後續版本。

top

RewriteRule 指令

說明定義重寫引擎的規則
語法RewriteRule 樣式 取代 [旗標]
內容伺服器組態、虛擬主機、目錄、.htaccess
覆寫FileInfo
狀態延伸模組
模組mod_rewrite

RewriteRule 指令是真正的重寫工作引擎。這個指令會出現很多次,每個實例代表一個單一的重寫規則。這些規則的定義順序很重要 - 它們會依據這個順序列在執行時間被應用。

樣式 是一個 Perl 相容的 正規表示法。根據 RewriteRule 指令定義的位置,這個樣式比較時會有所不同。

比對的內容是什麼?

  • VirtualHost 的架構中,樣式 最開始會比對 URL 的一部分,這個部分位於主機名和連接埠之後,且位於查詢字串之前(例如「/app1/index.html」)。這會是(經過 %- 解碼)的 URL-路徑

  • 在單一目錄的架構中(Directory 和 .htaccess),樣式 只會比對部分路徑,例如請求「/app1/index.html」可能會比對「app1/index.html」或「index.html」,這會取決於 RewriteRule 定義的位置。

    在比對之前,定義規則的目錄路徑會從當前對應的文件系統路徑中移除(會移除斜線及其之前的所有部分)。在單一目錄中移除前置部分後,在路徑中只會比對這個定義了此規則的「以下位置」的對應文件系統路徑部分。

    DocumentRootAlias 這樣的指令,甚或是之前 RewriteRule 替換的結果,都會決定當前對應的文件系統路徑。

  • 如果你想要比對主機名、連接埠或查詢字串,就請分別使用 RewriteCond 和變數 %{HTTP_HOST}%{SERVER_PORT}%{QUERY_STRING}

單一目錄重寫

  • 重寫引擎可以在 .htaccess 檔案和 <Directory> 區塊中使用,但會有一些額外的複雜度。
  • 要啟用這個架構的重寫引擎,你需要設定「RewriteEngine On」,而且Options FollowSymLinks」必須啟用。如果你的管理員已經停用使用者目錄的 FollowSymLinks,你將無法使用重寫引擎。基於安全原因,這個限制是必要的。
  • 請參閱 RewriteBase 指令,以獲得更多關於會新增到相對替換中前置部分的資訊。
  • 如果你希望依目錄對應(htaccess)RewriteRule 內的完整 URL 路徑,請在 RewriteCond 中使用變數 %{REQUEST_URI}
  • 移除的前置詞永遠以斜線結尾,表示比對會針對一個永遠不會有前導斜線的字串進行。因此,具有 ^/樣式在依目錄對應的環境中永遠無法比對。
  • 儘管重寫規則在 <Location><Files> 區段中(包括它們的正規表示法比對項)被語法允許,但這永遠不會是必要的,而且不受支援。在這些環境中會破壞的功能可能是相對取代。
  • If 區塊遵循目錄環境的規則。
  • 預設情況下,mod_rewrite 會在合併屬於同一環境的區段時覆寫規則。RewriteOptions 指令可以變更此行為,例如使用 Inherit 設定。
  • RewriteOptions 也規範設定在組態之相同巢狀層級的區段的行為。在下列範例中,預設情況下,只考量在第二個 If 區塊中所述的 RewriteRules,因為第一個已經被覆寫。使用 RewriteOptionsInherit 會強制 mod_rewrite 合併兩個區段,並考量兩組陳述式,而非只有最後一個。
<If "true">
  # Without RewriteOptions Inherit, this rule is overridden by the next
  # section and no redirect will happen for URIs containing 'foo'
  RewriteRule foo http://example.com/foo [R]
</If>
<If "true">
  RewriteRule bar http://example.com/bar [R]
</If>

關於正規表示法的提示,請參閱mod_rewrite 簡介

mod_rewrite 中,NOT 字元('!')也可以當作可能的樣式前置詞。這使你可以否定樣式;例如說:「如果目前的 URL 符合此樣式」。這可用於特別狀況,在這種狀況中,比較容易比對否定樣式,或是當作最後一個預設規則。

注釋

當使用 NOT 字元來否定樣式時,你無法在該樣式中納入分組的萬用字元部分。這是因為,當樣式不符合時(亦即,否定符合),群組中沒有內容。因此,如果使用否定樣式,你不能在取代字串中使用 $N

重寫規則的取代 是取代符合樣式的原始 URL 路徑的字串。取代可能是

檔案系統路徑
指定要傳遞給客戶端的資源在檔案系統中的位置。只有當規則是在伺服器(虛擬主機)環境中組態,而且取代中的路徑第一個元件存在於檔案系統時,取代才會被視為檔案系統路徑
URL 路徑
一個 DocumentRoot 相對路徑要提供服務的資源。請注意,mod_rewrite 會嘗試猜測您是否指定了檔案系統的路徑或 URL 路徑,方式是檢查路徑的第一個區段是否存在於檔案系統的根目錄。例如,如果您指定 /www/file.html 的替代字串,這會被視為 URL 路徑(除非)名為 www 的目錄存在於根目錄或您的檔案系統中(或者,在 .htaccess 檔案中使用重寫的情況,則相對應於您的文件根目錄),如果存在,則會被視為一個檔案系統路徑。如果您希望將其他 URL 對應指令(例如,Alias)套用於產生的 URL 路徑,請使用如下所述的 [PT] 標誌。
絕對 URL

如果指定了絕對 URL,mod_rewrite 會檢查主機名稱是否與目前主機相符。如果符合,則會將系統與主機名稱移除,並將產生的路徑視為 URL 路徑。否則,會對指定的 URL 執行外部重新導向。若要強制將外部重新導向回到目前主機,請參閱下方的 [R] 標誌。

請注意,使用絕對 URI 的重新導向(無論是明確的還是隱含的)會包含要求的查詢字串,若要避免這類情況,請參閱下方的 [QSD] 標誌。

-(破折號)
破折號表示不應執行替換(傳遞現有路徑,且不變動)。當需要套用標誌(見下文)但不變更路徑時使用。

除了純文字外,替代字串可以包括

  1. 重寫規則模式的反向參考($N
  2. 最後比對的 RewriteCond 模式的反向參考(%N
  3. 伺服器變數,如同規則條件測試字串(%{VARNAME}
  4. 對應函式呼叫(${mapname:key|default}

反向參考是格式為 $N 的識別碼(N=0..9),其中會以比對的 模式 的第 N 組內容取代。伺服器變數與 RewriteCond 指令的 TestString 相同。對應函式來自 RewriteMap 指令,並在其中進行說明。這些三種類型的變數會根據上述順序擴充。

重寫規則會以定義在組態檔中的順序套用至先前的重寫規則的結果。URL 路徑或檔案系統路徑(如上所述,請參閱 「什麼是匹配?」)將會完全替換替換中,而重寫處理序則會持續進行,直到套用了所有規則,或者因為被 L 旗標 或其他暗示立即終止的旗標(例如 ENDF)明確終止為止。

修改查詢字串

預設情況下,查詢字串會如實通過。然而,您可以在替換字串中建立含有查詢字串部分的 URL。只要在替換字串內使用問號就能夠表示下列文字應重新注入至查詢字串。當您想要刪除現有的查詢字串時,只需以問號結束替換字串。若要結合新增和舊有的查詢字串,請使用 [QSA] 旗標。

此外,您還可以設定特殊的 動作,只要將 [flags] 附加為 RewriteRule 指令的第三個參數即可。Flags 是一個逗號分隔的清單,用中括弧包圍,當中包含下列表格中的任何旗標。每個旗標的詳細資料和範例都可以在 重寫旗標文件 中取得。

旗標和語法 功能
B 在套用轉換之前,將反向參照中的非字母數字字元轉譯。針對伺服器變數的類似轉譯方式,請參閱「轉譯」對應函數詳細資料...
BCTLS 如同 [B],但只轉譯控制字元和空格。詳細資料...
BNE 不應轉譯 [B] 或 [BCTLS] 中的字元。詳細資料...
backrefnoplus|BNP 如果反向參照會被轉譯,則應將空格轉譯成 %20 而不是 +。在反向參照將於路徑組成部分(而非查詢字串)中使用時,這很有用處。詳細資料...
chain|C 規則會與下一個規則串連。如果規則失敗,則會略過與該規則串連的規則。詳細資料...
cookie|CO=NAME:VAL 在客戶端瀏覽器中設定 cookie。完整的語法為:CO=NAME:VAL:domain[:lifetime[:path[:secure[:httponly[samesite]]]]] 詳細資料...
discardpath|DPI 導致重寫 URI 的 PATH_INFO 部分被捨棄。詳細資料...
END 立即終止重寫處理序,而且不會套用任何更多規則。此外也會防止進一步執行每個目錄和 .htaccess 背景中的重寫規則。(可在 2.3.9 和後續版本中取得)詳細資料...
env|E=[!]VAR[:VAL] 導致環境變數 VAR 被設定(如果提供了值 VAL)。格式 VAR 可導致環境變數 VAR 取消設定。詳細資料...
forbidden|F 傳回 403 FORBIDDEN 回應給客戶端瀏覽器。詳細資料...
gone|G 傳回 410 GONE 回應給客戶端瀏覽器。詳細資料...
Handler|H=處理常式 導致結果 URI 被傳送給指定的 處理常式 進行處理。詳細資料...
last|L 立即停止改寫程序,並且不要再套用任何規則。特別注意每目錄與 .htaccess 環境的警示事項(另請參閱 END 標記)。詳細資料...
next|N 重新執行改寫程序,從第一條規則重新開始,使用目前規則組的結果作為起點。詳細資料...
nocase|NC 使樣式比較不區分大小寫。詳細資料...
noescape|NE 禁止 mod_rewrite 在會導致重新導向的改寫結果中,套用特殊字元的十六進位碼跳脫。 詳細資料...
nosubreq|NS 如果目前的請求是內部子請求,將導致跳過規則。詳細資料...
proxy|P 強迫取代 URL 被內部傳送作為代理請求。詳細資料...
passthrough|PT 強迫結果 URI 被傳遞回給 URL 對應引擎,以便處理其他 URI-到檔案名的轉換器,例如 別名重新導向詳細資料...
qsappend|QSA 將原始請求 URL 中的任何查詢字串附加到任何在改寫目標中建立的查詢字串。詳細資料...
qsdiscard|QSD 捨棄附加到傳入 URI 中的任何查詢字串。詳細資料...
qslast|QSL 詮釋最後一個(最右邊的)問號為查詢字串分隔符號,而不是平常使用的第一個(最左邊)。可在 2.4.19 和更新版本中使用。詳細資料...
redirect|R[=程式碼] 強制一次外部重新導向,選擇搭配指定的 HTTP 狀態碼。詳細資料...
skip|S=num 如果目前的規則相符,會指示改寫引擎跳過後面的 num 個規則。詳細資料...
type|T=MIME 型別 強迫目標檔案的 MIME 型別 為指定的型別。詳細資料...
UnsafeAllow3F 允許使用可能不安全的 URL 中的替換。詳情...
UnsafePrefixStat 允許使用主要變數或對檔案系統路徑的反向引用中的潛在不安全的替換。詳情...

首頁目錄擴充

當替換字串開頭是類似「/~user」的字串時 (透過明確文字或反向引用),mod_rewrite 會執行首頁目錄擴充,而與 mod_userdir 的存在或組態無關。

RewriteRule 指令上使用 PT 旗標時,不會發生此擴充。

以下是所有可能的替換組合及其意義

在特定伺服器組態 (httpd.conf) 中
針對要求「``GET /somepath/pathinfo''

已提供的規則 產生的替換
^/somepath(.*) otherpath$1 無效,不支援
^/somepath(.*) otherpath$1 [R] 無效,不支援
^/somepath(.*) otherpath$1 [P] 無效,不支援
^/somepath(.*) /otherpath$1 /otherpath/pathinfo
^/somepath(.*) /otherpath$1 [R] 透過外部重新導向 http://thishost/otherpath/pathinfo
^/somepath(.*) /otherpath$1 [P] 說不通,不支援
^/somepath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^/somepath(.*) http://thishost/otherpath$1 [R] 透過外部重新導向 http://thishost/otherpath/pathinfo
^/somepath(.*) http://thishost/otherpath$1 [P] 說不通,不支援
^/somepath(.*) http://otherhost/otherpath$1 透過外部重新導向 http://otherhost/otherpath/pathinfo
^/somepath(.*) http://otherhost/otherpath$1 [R] 透過外部重新導向 http://otherhost/otherpath/pathinfo ([R] 旗標是多餘的)
^/somepath(.*) http://otherhost/otherpath$1 [P] 透過內部代理伺服器 http://otherhost/otherpath/pathinfo

在針對 /somepath 的特定目錄組態中
(/physical/path/to/somepath/.htaccess,其中 RewriteBase "/somepath")
針對要求「``GET /somepath/localpath/pathinfo''

已提供的規則 產生的替換
^localpath(.*) otherpath$1 /somepath/otherpath/pathinfo
^localpath(.*) otherpath$1 [R] 透過外部重新導向 http://thishost/somepath/otherpath/pathinfo
^localpath(.*) otherpath$1 [P] 說不通,不支援
^localpath(.*) /otherpath$1 /otherpath/pathinfo
^localpath(.*) /otherpath$1 [R] 透過外部重新導向 http://thishost/otherpath/pathinfo
^localpath(.*) /otherpath$1 [P] 說不通,不支援
^localpath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^localpath(.*) http://thishost/otherpath$1 [R] 透過外部重新導向 http://thishost/otherpath/pathinfo
^localpath(.*) http://thishost/otherpath$1 [P] 說不通,不支援
^localpath(.*) http://otherhost/otherpath$1 透過外部重新導向 http://otherhost/otherpath/pathinfo
^localpath(.*) http://otherhost/otherpath$1 [R] 透過外部重新導向 http://otherhost/otherpath/pathinfo ([R] 旗標是多餘的)
^localpath(.*) http://otherhost/otherpath$1 [P] 透過內部代理伺服器 http://otherhost/otherpath/pathinfo

可用語言:  en  |  fr 

top

評論

注意
這不是問答區段。放到這裡的留言應針對如何改善文件或伺服器的建議,若已經實作或被認為不適當/離題,我們的管理員可能會將其移除。關於如何管理 Apache HTTP Server 的問題應導向我們的 IRC 頻道 #httpd,網址為 Libera.chat,或傳送至我們的郵寄清單