Apache HTTP Server 版本 2.4
說明 | 提供一個基於規則的改寫引擎,用於即時改寫請求的 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 詳細文件中提供了進一步的詳細資訊、討論和範例。
mod_rewrite
提供從 trace1
至 trace8
記錄層級的動作詳細記錄。記錄層級可以使用 LogLevel
指示,專門為 mod_rewrite
設定:在 debug
層級以前,沒有任何動作記錄,而 trace8
表示實際上已記錄所有動作。
mod_rewrite
使用較高追蹤記錄層級,會大幅降低 Apache HTTP Server 的執行速度!只有在除錯時,才將記錄層級設為高於 trace2
!LogLevel alert rewrite:trace3
熟悉早期 mod_rewrite
版本的人,無疑會尋找 RewriteLog
及 RewriteLogLevel
指示。此功能已完全由上文所述的新模組記錄組態取代。
僅取得特定於 mod_rewrite
的記錄訊息,必須透過 grep 管線記錄檔
tail -f error_log|fgrep '[rewrite:'
說明 | 設定每個目錄改寫的基本 URL |
---|---|
語法 | RewriteBase URL 路徑 |
預設 | 無 |
內容 | 目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 延伸模組 |
模組 | mod_rewrite |
RewriteBase
指示指定 URL 前置字首,將用於每個目錄 (htaccess) RewriteRule
指示,以替換相對路徑。
在每個目錄 (htaccess) 內容中於替換中使用相對路徑時,如果下列任一條件為真,這個指示必需使用
DocumentRoot
(而非透過其他方式存取,例如 Alias
) 底下。RewriteRule
目錄的檔案系統路徑,後面加上相對替換,也是伺服器上的有效 URL 路徑 (這很罕見)。Alias
或 mod_userdir
映射時,可以省略此指示。在下列範例中,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>
說明 | 定義執行改寫的條件 |
---|---|
語法 | RewriteCond 測試字串 條件樣式 [旗標] |
內容 | 伺服器組態、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 延伸模組 |
模組 | mod_rewrite |
RewriteCond
指令定義規則條件。可以在 RewriteRule
指令之前,輸入一個或多個 RewriteCond
。只有當目前 URI 的狀態符合其 wzor樣時才會使用下列規則,且同時符合這些條件時。
TestString 是可以包含下列展開建構的字串,除了純文字之外
$N
(0 <= N <= 9)形式的回引。$1 到 $9 可取得 vzor樣中群組部份(括號中)的存取權限,來自受目前一組 RewriteCond
條件約束的 RewriteRule
。$0 可以存取那個 vzor樣所配對到的整個字串。%N
(0 <= N <= 9)形式的回引。%1 到 %9 可取得 wzor樣中群組部份(同樣地在括號中)的存取權限,來自目前一組條件中最後一個配對到的 RewriteCond
。%0 可以存取那個 vzor樣所配對到的整個字串。${mapname:key|default}
形式的擴充。請參閱 RewriteMap 的文件 以取得更多資訊%{
變數名稱 }
形式的變數,其中 變數名稱 可以是下列清單中的字串HTTP 標頭 | 連線 & 要求 | |
---|---|---|
HTTP_ACCEPT HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_REFERER HTTP_USER_AGENT |
AUTH_TYPE CONN_REMOTE_ADDR CONTEXT_PREFIX CONTEXT_DOCUMENT_ROOT IPV6 PATH_INFO QUERY_STRING REMOTE_ADDR REMOTE_HOST REMOTE_IDENT REMOTE_PORT REMOTE_USER REQUEST_METHOD SCRIPT_FILENAME |
|
伺服器內部 | 日期與時間 | 特殊事項 |
DOCUMENT_ROOT SCRIPT_GROUP SCRIPT_USER SERVER_ADDR SERVER_ADMIN SERVER_NAME SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE |
TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME |
API_VERSION CONN_REMOTE_ADDR HTTPS IS_SUBREQ REMOTE_ADDR REQUEST_FILENAME REQUEST_SCHEME REQUEST_URI THE_REQUEST |
這些變數都和名稱相似的 HTTP MIME 標頭、Apache HTTP Server 的 C 變數或 Unix 系統的 struct tm
欄位相符。大多數在 這裡 或文件或 CGI 規格中的其他地方有記錄。
SERVER_NAME 和 SERVER_PORT 分別視 UseCanonicalName
和 UseCanonicalPhysicalPort
的值而定。
下列是 mod_rewrite
的特別變數。
API_VERSION
CONN_REMOTE_ADDR
mod_remoteip
模組)。HTTPS
mod_ssl
,也能安全地使用此變數)。IS_SUBREQ
REMOTE_ADDR
mod_remoteip
模組)。REQUEST_FILENAME
REQUEST_FILENAME
時已確定檔案或指令碼與請求相符,則為其完整的本機檔案系統路徑。否則,例如在虛擬主機中使用時,其值與 REQUEST_URI
相同。根據 AcceptPathInfo
的值,伺服器可能僅使用 REQUEST_URI
的部分開頭元件將請求映射到檔案。REQUEST_SCHEME
ServerName
的影響。REQUEST_URI
QUERY_STRING
。為 REQUEST_URI
傳回的值已進行 %-解碼,若要重新編碼,請讓它傳遞「escape」對應函數。THE_REQUEST
GET /index.html HTTP/1.1
」)。此處不包含瀏覽器傳送的任何其他標頭。與下方大多數其他變數不同,此值未取消跳脫(解碼)。如果 TestString 具有特殊值 expr
,則 CondPattern 會視為 ap_expr。如果未提供 novary
旗標,則在指令中參照的 HTTP 標頭將會新增到 Vary 標頭。
您應該了解的其他事項
SCRIPT_FILENAME 和 REQUEST_FILENAME 變數包含相同的值,也就是 Apache HTTP Server 內部 request_rec
結構之 filename
欄位的數值。第一個名稱為常見的 CGI 變數名稱,而第二個名稱是 REQUEST_URI 的適當對應名稱(其中包含 request_rec
之 uri
欄位的數值)。
如果進行取代且重寫繼續進行,這兩個變數的值都將適當地更新。
如果在伺服器內文函脈絡中使用(例如,在請求被映射到檔案系統之前),SCRIPT_FILENAME 和 REQUEST_FILENAME 不能包含完整的本地檔案系統路徑,因為在處理的這個階段路徑是未知的。但在這種情況下,這兩個變數一開始會包含 REQUEST_URI 的值。要取得在伺服器內文函脈絡中請求的完整本地檔案系統路徑,請使用基於網址的前瞻 `%{LA-U:REQUEST_FILENAME}` 來決定 REQUEST_FILENAME 的最終值。
%{ENV:variable}
,其中 variable 可以是任何環境變數,也可使用。這是透過內部 Apache httpd 結構查詢的,如果在其中找不到,則會透過 Apache httpd 伺服器程序的 `getenv()` 查詢。%{SSL:variable}
,其中 variable 是 SSL 環境變數 的名稱,可以在載入 mod_ssl
時或未載入時使用,但如果未載入時,通常會擴充為空字串。範例:%{SSL:SSL_CIPHER_USEKEYSIZE}
可能會擴充為 128
。即使未設定 SSLOptions
指令的 StdEnvVars
選項,也可以使用這些變數。%{HTTP:header}
,其中 header 可以是任何 HTTP MIME 標題名稱,可以隨時用來取得在 HTTP 請求中送出的標題值。範例:%{HTTP:Proxy-Connection}
是 HTTP 標題 ``Proxy-Connection:
'' 的值。如果在條件中使用了 HTTP 標題,在條件針對請求評估為 true 時,此標題會加入回應的 Vary 標題中。如果條件針對請求評估為 false,則不會加入標題。將 HTTP 標題加入回應的 Vary 標題是正確快取所需的。
必須記住,對 'ornext|OR
' 旗標而言,條件會遵循短路邏輯,因此某些條件可能不會被評估。
%{LA-U:variable}
可用於前瞻,前瞻會執行內部(基於網址)子請求來決定 variable 的最終值。這可以用於存取改寫變數,該變數在當前階段不可用,但會在稍後階段設定。例如,若要根據伺服器內文函脈絡(httpd.conf
檔)中的 REMOTE_USER
變數進行改寫,您必須使用 %{LA-U:REMOTE_USER}
― 此變數由授權階段設定,而授權階段會在網址翻譯階段(mod_rewrite
會在該階段運作)之後執行。
另一方面,因為 mod_rewrite
透過 API 的 Fixup 階段來實作其伺服器內文函脈絡(.htaccess
檔),而且因為授權階段會在這個階段之前執行,所以您可以在該脈絡中使用 %{REMOTE_USER}
。
%{LA-F:變數}
可用於執行內部(基於檔案名稱)的子請求,以決定變數的最終值。大多數情況下,這與上述的 LA-U 相同。CondPattern 是條件模式,一種套用於 TestString 當前個體的正規表示式。在與 CondPattern 比對之前,會先評估 TestString。
CondPattern 通常是 與 perl 相容的正規表示式,但有額外的語法可用於對 Teststring 執行其他有用的測試
!
' 字元(驚嘆號)來否定條件的結果,不論使用的是何種類型的 CondPattern。""
(兩個引號),這會將 TestString 與空字串進行比對。RewriteCond %{HTTP_USER_AGENT} "=This Robot/1.0"
!-eq
。經由子請求存在的 URL。
檢查 TestString 是否為一個有效的 URL,且可經由伺服器當前為該路徑所設定的所有存取控制而存取。這會使用內部子請求來執行檢查,因此請小心使用,這可能會影響伺服器的效能!
此標記只會傳回有關存取控制、驗證和授權等事項的資訊。此標記不會傳回已設定的處理常式 (例如靜態檔案、CGI、代理伺服器等) 所會傳回的狀態碼的資訊。
RewriteCond /var/www/%{REQUEST_URI} !-f RewriteRule ^(.+) /other/archive/$1 [R]
如果 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)ornext|OR
' (or next condition)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)範例
若要根據請求的 ``User-Agent:
'' 標頭改寫網站的首頁,您可以使用下列內容
RewriteCond "%{HTTP_USER_AGENT}" "(iPhone|Blackberry|Android)" RewriteRule "^/$" "/homepage.mobile.html" [L] RewriteRule "^/$" "/homepage.std.html" [L]
說明:如果您使用的瀏覽器標示為行動裝置瀏覽器(請注意,範例並不完整,因為還有許多其他行動裝置平台),就會提供行動版首頁。否則,會提供標準頁面。
預設情況下,多個 RewriteCond
會按順序評估,並暗示邏輯 AND。如果條件失敗,沒有 OR
旗標,則整個規則組會中斷,且不會評估進一步的條件。
說明 | 啟用或停用執行時期改寫引擎 |
---|---|
語法 | RewriteEngine on|off |
預設 | RewriteEngine off |
內容 | 伺服器組態、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 延伸模組 |
模組 | mod_rewrite |
指令會啟用或停用執行時期改寫引擎。如果設為 RewriteEngine
off
,這個模組完全不執行執行時期處理。它甚至不更新 SCRIPT_URx
環境變數。
在特定情境中,請使用此指令來停用規則,而不是註解掉所有 RewriteRule
指令。
請注意,虛擬主機不會繼承重寫設定。這表示在希望使用重寫規則的每個虛擬主機都必須提供 RewriteEngine on
指令。
當在未設定 RewriteEngine
為 on
的內容中定義時,prg
類型的 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 以取得更多資訊。
MapType 和 MapSource 可使用下列組合
httxt2dbm
工具從純文字檔格式建立的。(詳細資料 ...)RewriteMap
提供的四個可用內部函式之一:toupper、tolower、escape 或 unescape。(詳細資料 ...)可以在 RewriteMap HowTo 中找到更多詳細資料和大量範例
說明 | 設定重寫引擎的一些特殊選項 |
---|---|
語法 | 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
這個選項會強制目前的組態和子組態忽略將從指定 InheritDown
或 InheritDownBefore
的父項繼承的所有規則。
在 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-3368 和 CVE-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_userdir
和 mod_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 及後續版本。
說明 | 定義重寫引擎的規則 |
---|---|
語法 | 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
定義的位置。
在比對之前,定義規則的目錄路徑會從當前對應的文件系統路徑中移除(會移除斜線及其之前的所有部分)。在單一目錄中移除前置部分後,在路徑中只會比對這個定義了此規則的「以下位置」的對應文件系統路徑部分。
像 DocumentRoot
和 Alias
這樣的指令,甚或是之前 RewriteRule
替換的結果,都會決定當前對應的文件系統路徑。
如果你想要比對主機名、連接埠或查詢字串,就請分別使用 RewriteCond
和變數 %{HTTP_HOST}
、%{SERVER_PORT}
或 %{QUERY_STRING}
。
<Directory>
區塊中使用,但會有一些額外的複雜度。RewriteEngine On
」,而且「Options FollowSymLinks
」必須啟用。如果你的管理員已經停用使用者目錄的 FollowSymLinks
,你將無法使用重寫引擎。基於安全原因,這個限制是必要的。RewriteBase
指令,以獲得更多關於會新增到相對替換中前置部分的資訊。RewriteCond
中使用變數 %{REQUEST_URI}
。^/
的樣式在依目錄對應的環境中永遠無法比對。<Location>
和 <Files>
區段中(包括它們的正規表示法比對項)被語法允許,但這永遠不會是必要的,而且不受支援。在這些環境中會破壞的功能可能是相對取代。If
區塊遵循目錄環境的規則。RewriteOptions
指令可以變更此行為,例如使用 Inherit 設定。RewriteOptions
也規範設定在組態之相同巢狀層級的區段的行為。在下列範例中,預設情況下,只考量在第二個 If
區塊中所述的 RewriteRules,因為第一個已經被覆寫。使用 RewriteOptions
Inherit 會強制 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 不符合此樣式」。這可用於特別狀況,在這種狀況中,比較容易比對否定樣式,或是當作最後一個預設規則。
$N
!重寫規則的取代 是取代符合樣式的原始 URL 路徑的字串。取代可能是
DocumentRoot
相對路徑要提供服務的資源。請注意,mod_rewrite
會嘗試猜測您是否指定了檔案系統的路徑或 URL 路徑,方式是檢查路徑的第一個區段是否存在於檔案系統的根目錄。例如,如果您指定 /www/file.html
的替代字串,這會被視為 URL 路徑(除非)名為 www
的目錄存在於根目錄或您的檔案系統中(或者,在 .htaccess
檔案中使用重寫的情況,則相對應於您的文件根目錄),如果存在,則會被視為一個檔案系統路徑。如果您希望將其他 URL 對應指令(例如,Alias
)套用於產生的 URL 路徑,請使用如下所述的 [PT]
標誌。如果指定了絕對 URL,mod_rewrite
會檢查主機名稱是否與目前主機相符。如果符合,則會將系統與主機名稱移除,並將產生的路徑視為 URL 路徑。否則,會對指定的 URL 執行外部重新導向。若要強制將外部重新導向回到目前主機,請參閱下方的 [R]
標誌。
請注意,使用絕對 URI 的重新導向(無論是明確的還是隱含的)會包含要求的查詢字串,若要避免這類情況,請參閱下方的 [QSD]
標誌。
-
(破折號)除了純文字外,替代字串可以包括
$N
)%N
)%{VARNAME}
)${mapname:key|default}
)反向參考是格式為 $
N 的識別碼(N=0..9),其中會以比對的 模式 的第 N 組內容取代。伺服器變數與 RewriteCond
指令的 TestString 相同。對應函式來自 RewriteMap
指令,並在其中進行說明。這些三種類型的變數會根據上述順序擴充。
重寫規則會以定義在組態檔中的順序套用至先前的重寫規則的結果。URL 路徑或檔案系統路徑(如上所述,請參閱 「什麼是匹配?」)將會完全替換於替換中,而重寫處理序則會持續進行,直到套用了所有規則,或者因為被 L
旗標 或其他暗示立即終止的旗標(例如 END
或 F
)明確終止為止。
預設情況下,查詢字串會如實通過。然而,您可以在替換字串中建立含有查詢字串部分的 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 |