Apache HTTP Server 2.4 版
說明 | 提供將主機檔案系統的不同部分對應到文件樹和 URL 重新導向的功能 |
---|---|
狀態 | 基本 |
模組識別碼 | alias_module |
原始碼檔案 | mod_alias.c |
此模組中包含的指令允許在要求到達伺服器時操作和控制 URL。 Alias
和 ScriptAlias
指令用於在 URL 和檔案系統路徑之間進行對應。這允許並非直接位於 DocumentRoot
之下的內容提供为網路文件樹的一部分。 ScriptAlias
指令還有另外一個效果,就是將目標目錄標記為只包含 CGI 腳本。
Redirect
指令用於指示用戶端以不同的 URL 提出新要求。當資源已移至新位置時,這通常會被使用。
當 Alias
、ScriptAlias
和 Redirect
指令用於 <Location>
或 <LocationMatch>
區段中時,可使用 表達式語法 操作目標路徑或 URL。
mod_alias
旨在處理簡單的 URL 操作任務。對於較複雜的任務,例如操縱查詢字串,請使用 mod_rewrite
所提供的工具。
出現在不同內容中的別名和重新導向會依照標準的合併規則處理,就如同其他指令一般。
首先,會在處理別名前處理所有重新導向,因此任何符合重新導向
或重新導向對應
的請求,都不會套用別名。
基於這個原因,當兩個或以上的指令套用到同一個子路徑時,您必須列出最具體的路徑在最前面,才能讓所有指令都生效。
Alias "/foo/bar" "/baz" Alias "/foo" "/gaq"
說明 | 將網址對應到檔案系統中的位置 |
---|---|
語法 | 別名 [網址路徑] 檔案路徑|目錄路徑 |
內容 | 伺服器組態、虛擬主機、目錄 |
狀態 | 基本 |
模組 | mod_alias |
別名
指令允許將文件儲存於檔案系統中的DocumentRoot
之外。
Alias "/image" "/ftp/pub/image"
要求 http://example.com/image/foo.gif
會導致伺服器傳回檔案 /ftp/pub/image/foo.gif
。只有完整路徑區段會相符,所以上述的別名不會相符要求 http://example.com/imagefoo.gif
。對於使用正規表示式的更複雜比對,請參考AliasMatch
指令。
注意,如果你在URL 路徑 裡包含一個尾隨 /,那麼伺服器會要求一個尾隨 / 才能展開別名。也就是說,如果你使用
Alias "/icons/" "/usr/local/apache/icons/"
那麼 URL /icons
將不會有別名,因為缺少那個尾隨 /。同樣地,如果你在 URL 路徑 遺漏了斜線,那麼你必須也在 檔案路徑 中遺漏它。
注意你可能需要指定額外的<目錄>
區段,來涵蓋別名的目的地。別名產生於<目錄>
區段檢查之前,所以只會影響別名的目的地。(不過請注意,<位置>
區段會在別名執行前先執行一次,所以會套用。)
特別,如果你正在為DocumentRoot
外部的目錄建立一個別名
,你可能需要明確允許目標目錄的存取權。
Alias "/image" "/ftp/pub/image" <Directory "/ftp/pub/image"> Require all granted </Directory>
在URL 路徑 參數中的任何數量斜線都相符於請求的 URL 路徑中的任何數量斜線。
如果Alias
指令使用於<位置>
或<LocationMatch>
區段中,URL 路徑會被省略,而檔案路徑則會使用表示式語法來詮釋。
此語法在 Apache 2.4.19 及後續版本中使用。
<Location "/image"> Alias "/ftp/pub/image" </Location> <LocationMatch "/error/(?<NUMBER>[0-9]+)"> Alias "/usr/local/apache/errors/%{env:MATCH_NUMBER}.html" </LocationMatch>
注意,當AliasPreservePath
指令開啟時,完整路徑會對應到目的地。當指令關閉時,所有 URL 都會對應到單一的目標 URL。
# /files/foo and /files/bar mapped to /ftp/pub/files/foo and /ftp/pub/files/bar <Location "/files"> AliasPreservePath on Alias "/ftp/pub/files" </Location> # /errors/foo and /errors/bar mapped to /var/www/errors.html <Location "/errors"> AliasPreservePath off Alias "/var/www/errors.html" </Location>
說明 | 使用正規表示式將 URL 對應到檔案系統位置 |
---|---|
語法 | AliasMatch 正規表示式 檔案路徑|目錄路徑 |
內容 | 伺服器設定,虛擬主機 |
狀態 | 基本 |
模組 | mod_alias |
此指令等同於Alias
,但使用正規表示式,而非單純的前置比對。提供的正規表示式會與 URL 路徑比對,如果相符,伺服器會將任何括號中的相符部分替換到給定的字串中,並使用它做為檔名。舉例來說,要啟用/icons
目錄,可以這樣做
AliasMatch "^/icons(/|$)(.*)" "/usr/local/apache/icons$1$2"
所有正規表示式 的力量皆可使用。舉例來說,可以建構一個對 URL 路徑進行不區分大小寫比對的別名
AliasMatch "(?i)^/image(.*)" "/ftp/pub/image$1"
在 Alias
和 AliasMatch
之間有一個細微的差異,就是 Alias
會將 URI 中已對應的部份以外的任何附加部份自動複製到右側檔案路徑的結尾,而 AliasMatch
則不會。這表示在幾乎所有情況下,你都會希望正規表示式從頭到尾對應整個請求 URI,並在右側使用替換。
換句話說,只是將 Alias
更改為 AliasMatch
沒有相同的效果。至少,你需要在正規表示式的開頭加上 ^
,在結尾加上 (.*)$
,並在替換的結尾加上 $1
。
例如,假設你想用 AliasMatch 替換這個
Alias "/image/" "/ftp/pub/image/"
這不是等效的 - 不要這樣做!這會將所有在任何地方都有 /image/ 這個字串的請求都傳送到 /ftp/pub/image/
AliasMatch "/image/" "/ftp/pub/image/"
這是你需要用來產生相同效果的東西
AliasMatch "^/image/(.*)$" "/ftp/pub/image/$1"
當然,在 Alias
可以使用的場合,就不需要使用 AliasMatch
。AliasMatch
讓你做更多複雜的事情。例如,你可以從不同的目錄提供不同類型的檔案
AliasMatch "^/image/(.*)\.jpg$" "/files/jpg.images/$1.jpg" AliasMatch "^/image/(.*)\.gif$" "/files/gif.images/$1.gif"
在這個模組的指令與請求的 URL 路徑進行比對之前,伺服器會捨棄請求的 URL 中的前面兩個斜線。
說明 | 對應位置中的別名後的完整路徑。 |
---|---|
語法 | AliasPreservePath OFF|ON |
預設值 | AliasPreservePath OFF |
內容 | 伺服器組態、虛擬主機、目錄 |
狀態 | 基本 |
模組 | mod_alias |
相容性 | 2.4.58 和更新版本 |
在使用 Alias
指令的兩個參數版本時,別名後的完整路徑會被保留。在 Location
指令中使用 Alias
指令的一個參數版本時,完整的路徑會被捨棄,且所有 URL 都會對應到目標表達式。
要讓 Alias
指令的一個參數版本保留路徑,就像 Alias
指令兩個參數版本一樣,請啟用這個設定。
說明 | 傳送一個外部重新導向,請用戶端取得另一個 URL |
---|---|
語法 | Redirect [狀態] [URL-路徑] URL |
內容 | 伺服器設定檔、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_alias |
Redirect
指令藉由請用戶端從新位置重新取得資源,將舊的 URL 對應到新的 URL。
舊的 URL-路徑 是區分大小寫(經過 % 解碼),並以斜線開頭的路徑。不允許使用相對路徑。
新的 URL 可能是一個以範例和主機名稱開頭的絕對 URL,或是一個以斜線開頭的 URL 路徑。後者會加入目前的伺服器範例和主機名稱。
然後任何以 URL 路徑 為開頭的請求,會傳回一個導向至目標 URL 位置的重新導向請求。已配對 URL 路徑 後的附加路徑資訊,會附加到目標 URL 後面。
# Redirect to a URL on a different host Redirect "/service" "http://foo2.example.com/service" # Redirect to a URL on the same host Redirect "/one" "/two"
如果客戶端請求 http://example.com/service/foo.txt
,它將會被告知存取 http://foo2.example.com/service/foo.txt
。這包括具有 GET
參數的請求,例如 http://example.com/service/foo.pl?q=23&a=42
,會重新導向至 http://foo2.example.com/service/foo.pl?q=23&a=42
。請注意,POST
將會被捨棄。
只會配對完整路徑區段,所以上述範例不會配對 http://example.com/servicefoo.txt
的請求。若要使用 表示式語法 進行更複雜的配對,請省掉 URL 路徑引數,如以下所述。或者,若要使用正規表示式進行配對,請參閱 RedirectMatch
指令。
Redirect
指令優先於 Alias
和 ScriptAlias
指令,不論它們在組態檔案中的順序如何。Location
內的 Redirect
指令優先於具有 URL 路徑 的 Redirect
和 Alias
指令。
如果沒有提供 狀態 引數,重新導向將會是「臨時的」(HTTP 狀態 302)。這表示伺服器已暫時移除資源。狀態
引數可用於傳回其他 HTTP 狀態碼
可以傳回其他狀態碼,方法是將數值狀態碼作為 狀態 的值。如果狀態在 300 到 399 之間,則 URL 引數必須存在。如果狀態不在 300 到 399 之間,則 URL 引數必須被省掉。狀態必須是 Apache HTTP Server 已知的有效 HTTP 狀態碼 (請參閱 http_protocol.c 中的函式 send_error_response
)。
Redirect permanent "/one" "http://example.com/two" Redirect 303 "/three" "http://example.com/other"
如果在 <Location>
或 <LocationMatch>
區段中使用 Redirect
指令,且省掉 URL 路徑,則 URL 參數將會使用 表示式語法 來解讀。
此語法在 Apache 2.4.19 及後續版本中使用。
<Location "/one"> Redirect permanent "http://example.com/two" </Location> <Location "/three"> Redirect 303 "http://example.com/other" </Location> <LocationMatch "/error/(?<NUMBER>[0-9]+)"> Redirect permanent "http://example.com/errors/%{env:MATCH_NUMBER}.html" </LocationMatch>
說明 | 根據目前的 URL 正規表示式配對,傳送外部重新導向 |
---|---|
語法 | RedirectMatch [狀態] 正規表示式 URL |
內容 | 伺服器設定檔、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_alias |
此指令等同於 Redirect
,但使用 正規表示式,而非單純的前置元件比對。所提供的正規表示式將與 URL 路徑比對,若比對結果相符,則伺服器將將任何括弧中的比對結果帶入指定的字串,並將其用作檔案名稱。例如,若要將所有 GIF 檔案轉址至另一個伺服器上同名的 JPEG 檔案,可以使用
RedirectMatch "(.*)\.gif$" "http://other.example.com$1.jpg"
說明 | 傳送外部永久重新導向,要求用戶端擷取另一個 URL |
---|---|
語法 | RedirectPermanent URL 路徑 URL |
內容 | 伺服器設定檔、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_alias |
此指令讓用戶端知道轉址是永久性的(狀態 301)。與 Redirect permanent
完全相同。
說明 | 允許重新導向目標為相對路徑。 |
---|---|
語法 | RedirectRelative 開啟|關閉 |
預設值 | RedirectRelative 關閉 |
內容 | 伺服器組態、虛擬主機、目錄 |
狀態 | 基本 |
模組 | mod_alias |
相容性 | 2.4.58 和更新版本 |
預設情況下,如果 轉址
指令的目標 URL 為從「/」字元開始的相對 URL,則伺服器會在回應用戶端之前,將其轉換為絕對 URL。透過將 RedirectRelative
設定為「開啟」值,相對 URL 便可直接提供給用戶端。
說明 | 傳送外部暫時重新導向,要求用戶端擷取另一個 URL |
---|---|
語法 | RedirectTemp URL 路徑 URL |
內容 | 伺服器設定檔、虛擬主機、目錄、.htaccess |
覆寫 | FileInfo |
狀態 | 基本 |
模組 | mod_alias |
此指令讓用戶端知道轉址僅為暫時性的(狀態 302)。與 Redirect temp
完全相同。
說明 | 將 URL 對應至檔案系統位置,並指定目標為 CGI 腳本 |
---|---|
語法 | ScriptAlias [URL 路徑] 檔案路徑| 目錄路徑 |
內容 | 伺服器組態、虛擬主機、目錄 |
狀態 | 基本 |
模組 | mod_alias |
ScriptAlias
指令與 別名
指令有相同的行為,但除此之外,它標記目標目錄為含有會由 mod_cgi
的 cgi 腳本處理器處理的 CGI 腳本。路徑以 URL 路徑 開頭(會進行大小寫敏感的 %-編碼)的 URL,將會對應到從第二個引數開始的腳本,而此引數為本機檔案系統中的完整路徑名稱。
ScriptAlias "/cgi-bin/" "/web/cgi-bin/"
對 http://example.com/cgi-bin/foo
的要求會導致伺服器執行 /web/cgi-bin/foo
這個指令碼。這種組態基本上等於
Alias "/cgi-bin/" "/web/cgi-bin/" <Location "/cgi-bin"> SetHandler cgi-script Options +ExecCGI </Location>
ScriptAlias
也可以用在您有的指令碼或處理工具中。例如
ScriptAlias "/cgi-bin/" "/web/cgi-handler.pl"
在這種場景中,/cgi-bin/
中要求的所有檔案都將由您配置的檔案處理,這讓您可以使用您自訂的處理工具。您可能會想將這用做 CGI 的包裝,以便可以加入內容,或其他一些量身打造的動作。
DocumentRoot
中會比較安全,以避免在變更組態時意外揭露其原始碼。ScriptAlias
能夠同時對應 URL 並指定 CGI 指令碼,使這變得容易。如果您選擇將 CGI 指令碼置於已能透過網路存取的目錄中,就不要使用 ScriptAlias
。相反地,使用 <Directory>
、SetHandler
及 Options
,就像這樣<Directory "/usr/local/apache2/htdocs/cgi-bin"> SetHandler cgi-script Options ExecCGI </Directory>由於多個 URL-paths 可能對應到相同的檔案系統位置,因此這是有必要的,而這可能會繞過
ScriptAlias
,並在不受 Directory
區段限制時揭露 CGI 指令碼的原始碼。如果 ScriptAlias
指令用於 <Location>
或 <LocationMatch>
區段中而且 URL 路徑遺漏了,那麼 URL 參數會使用 表達式語法 進行詮釋。
此語法在 Apache 2.4.19 及後續版本中使用。
<Location "/cgi-bin"> ScriptAlias "/web/cgi-bin/" </Location> <LocationMatch "/cgi-bin/errors/(?<NUMBER>[0-9]+)"> ScriptAlias "/web/cgi-bin/errors/%{env:MATCH_NUMBER}.cgi" </LocationMatch>
說明 | 使用正規表示式將 URL 對應到檔案系統位置並指定目標為一個 CGI 指令碼 |
---|---|
語法 | ScriptAliasMatch regex file-path|directory-path |
內容 | 伺服器設定,虛擬主機 |
狀態 | 基本 |
模組 | mod_alias |
這個指令等於 ScriptAlias
,但使用 正規表示式,而不是簡單的前置字串比對。提供的正規表示式會比對 URL 路徑,如果比對相符,伺服器會將任何圍在括弧內的相符部分替換成指定的字串,並將其用為檔案名稱。例如,要啟用標準的 /cgi-bin
,可以這樣使用
ScriptAliasMatch "^/cgi-bin(.*)" "/usr/local/apache/cgi-bin$1"
至於 AliasMatch,正規表示式 的全部功能都可用。例如,可以建立一個指令別名,並以大小寫不敏感的方式比對 URL 路徑
ScriptAliasMatch "(?i)^/cgi-bin(.*)" "/usr/local/apache/cgi-bin$1"
與 Alias
和 AliasMatch
之間差異相關的考量,也適用於 ScriptAlias
與 ScriptAliasMatch
之間的差異。有關詳細資訊,請參閱 AliasMatch
。