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

Apache 模組 mod_alias

使用語言:  en  |  fr  |  ja  |  ko  |  tr 

說明提供將主機檔案系統的不同部分對應到文件樹和 URL 重新導向的功能
狀態基本
模組識別碼alias_module
原始碼檔案mod_alias.c

摘要

此模組中包含的指令允許在要求到達伺服器時操作和控制 URL。 AliasScriptAlias 指令用於在 URL 和檔案系統路徑之間進行對應。這允許並非直接位於 DocumentRoot 之下的內容提供为網路文件樹的一部分。 ScriptAlias 指令還有另外一個效果,就是將目標目錄標記為只包含 CGI 腳本。

Redirect 指令用於指示用戶端以不同的 URL 提出新要求。當資源已移至新位置時,這通常會被使用。

AliasScriptAliasRedirect 指令用於 <Location><LocationMatch> 區段中時,可使用 表達式語法 操作目標路徑或 URL。

mod_alias 旨在處理簡單的 URL 操作任務。對於較複雜的任務,例如操縱查詢字串,請使用 mod_rewrite 所提供的工具。

Support Apache!

主題

指令

錯誤修正檢查清單

請另見

top

處理順序

出現在不同內容中的別名和重新導向會依照標準的合併規則處理,就如同其他指令一般。

首先,會在處理別名前處理所有重新導向,因此任何符合重新導向重新導向對應的請求,都不會套用別名。

基於這個原因,當兩個或以上的指令套用到同一個子路徑時,您必須列出最具體的路徑在最前面,才能讓所有指令都生效。

Alias "/foo/bar" "/baz"
Alias "/foo" "/gaq"

但是如果上面這兩個指令的順序相反,/foo別名會永遠在/foo/bar別名之前符合,因此後者會被忽略。

top

別名 指令

說明將網址對應到檔案系統中的位置
語法別名 [網址路徑] 檔案路徑|目錄路徑
內容伺服器組態、虛擬主機、目錄
狀態基本
模組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>
top

AliasMatch 指令

說明使用正規表示式將 URL 對應到檔案系統位置
語法AliasMatch 正規表示式 檔案路徑|目錄路徑
內容伺服器設定,虛擬主機
狀態基本
模組mod_alias

此指令等同於Alias,但使用正規表示式,而非單純的前置比對。提供的正規表示式會與 URL 路徑比對,如果相符,伺服器會將任何括號中的相符部分替換到給定的字串中,並使用它做為檔名。舉例來說,要啟用/icons 目錄,可以這樣做

AliasMatch "^/icons(/|$)(.*)" "/usr/local/apache/icons$1$2"

所有正規表示式 的力量皆可使用。舉例來說,可以建構一個對 URL 路徑進行不區分大小寫比對的別名

AliasMatch "(?i)^/image(.*)" "/ftp/pub/image$1"

AliasAliasMatch 之間有一個細微的差異,就是 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 可以使用的場合,就不需要使用 AliasMatchAliasMatch 讓你做更多複雜的事情。例如,你可以從不同的目錄提供不同類型的檔案

AliasMatch "^/image/(.*)\.jpg$" "/files/jpg.images/$1.jpg"
AliasMatch "^/image/(.*)\.gif$" "/files/gif.images/$1.gif"

在這個模組的指令與請求的 URL 路徑進行比對之前,伺服器會捨棄請求的 URL 中的前面兩個斜線。

top

AliasPreservePath 指令

說明對應位置中的別名後的完整路徑。
語法AliasPreservePath OFF|ON
預設值AliasPreservePath OFF
內容伺服器組態、虛擬主機、目錄
狀態基本
模組mod_alias
相容性2.4.58 和更新版本

在使用 Alias 指令的兩個參數版本時,別名後的完整路徑會被保留。在 Location 指令中使用 Alias 指令的一個參數版本時,完整的路徑會被捨棄,且所有 URL 都會對應到目標表達式。

要讓 Alias 指令的一個參數版本保留路徑,就像 Alias 指令兩個參數版本一樣,請啟用這個設定。

top

Redirect 指令

說明傳送一個外部重新導向,請用戶端取得另一個 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 指令優先於 AliasScriptAlias 指令,不論它們在組態檔案中的順序如何。Location 內的 Redirect 指令優先於具有 URL 路徑RedirectAlias 指令。

如果沒有提供 狀態 引數,重新導向將會是「臨時的」(HTTP 狀態 302)。這表示伺服器已暫時移除資源。狀態 引數可用於傳回其他 HTTP 狀態碼

永久
傳回永久的重新導向狀態 (301),表示資源已永久移除。
臨時
傳回暫時的重新導向狀態 (302)。這是預設值。
另尋其他
傳回「另尋其他」狀態 (303),表示資源已被取代。
已移除
傳回「已移除」狀態 (410),表示資源已永久移除。當使用此狀態時,應省掉 URL 引數。

可以傳回其他狀態碼,方法是將數值狀態碼作為 狀態 的值。如果狀態在 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>
top

RedirectMatch 指令

說明根據目前的 URL 正規表示式配對,傳送外部重新導向
語法RedirectMatch [狀態] 正規表示式 URL
內容伺服器設定檔、虛擬主機、目錄、.htaccess
覆寫FileInfo
狀態基本
模組mod_alias

此指令等同於 Redirect,但使用 正規表示式,而非單純的前置元件比對。所提供的正規表示式將與 URL 路徑比對,若比對結果相符,則伺服器將將任何括弧中的比對結果帶入指定的字串,並將其用作檔案名稱。例如,若要將所有 GIF 檔案轉址至另一個伺服器上同名的 JPEG 檔案,可以使用

RedirectMatch "(.*)\.gif$" "http://other.example.com$1.jpg"

別名別名比對 差異相關之考量,也適用於 轉址轉址比對 之差異。詳細資訊請參閱 別名比對

top

RedirectPermanent 指令

說明傳送外部永久重新導向,要求用戶端擷取另一個 URL
語法RedirectPermanent URL 路徑 URL
內容伺服器設定檔、虛擬主機、目錄、.htaccess
覆寫FileInfo
狀態基本
模組mod_alias

此指令讓用戶端知道轉址是永久性的(狀態 301)。與 Redirect permanent 完全相同。

top

RedirectRelative 指令

說明允許重新導向目標為相對路徑。
語法RedirectRelative 開啟|關閉
預設值RedirectRelative 關閉
內容伺服器組態、虛擬主機、目錄
狀態基本
模組mod_alias
相容性2.4.58 和更新版本

預設情況下,如果 轉址 指令的目標 URL 為從「/」字元開始的相對 URL,則伺服器會在回應用戶端之前,將其轉換為絕對 URL。透過將 RedirectRelative 設定為「開啟」值,相對 URL 便可直接提供給用戶端。

top

RedirectTemp 指令

說明傳送外部暫時重新導向,要求用戶端擷取另一個 URL
語法RedirectTemp URL 路徑 URL
內容伺服器設定檔、虛擬主機、目錄、.htaccess
覆寫FileInfo
狀態基本
模組mod_alias

此指令讓用戶端知道轉址僅為暫時性的(狀態 302)。與 Redirect temp 完全相同。

top

ScriptAlias 指令

說明將 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 的包裝,以便可以加入內容,或其他一些量身打造的動作。

避免將 CGI 指令碼置於 DocumentRoot 中會比較安全,以避免在變更組態時意外揭露其原始碼。ScriptAlias 能夠同時對應 URL 並指定 CGI 指令碼,使這變得容易。如果您選擇將 CGI 指令碼置於已能透過網路存取的目錄中,就不要使用 ScriptAlias。相反地,使用 <Directory>SetHandlerOptions,就像這樣
<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>

請另見

top

ScriptAliasMatch Directives

說明使用正規表示式將 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"

AliasAliasMatch 之間差異相關的考量,也適用於 ScriptAliasScriptAliasMatch 之間的差異。有關詳細資訊,請參閱 AliasMatch

使用語言:  en  |  fr  |  ja  |  ko  |  tr 

top

回應

注意
這不是問答區。放在這裡的評論應指向關於改善文件或伺服器方面的建議,且如果已被實作或被認為不合法/離題,我們的管理員可能會將其移除。關於如何管理 Apache HTTP Server 的問題應轉發到我們的 IRC 頻道「#httpd」(於 Libera.chat),或發送至我們的郵寄清單