主要包括Alias指令、AliasMatch、Redirect、RedirectMatch、ScriptAlias和ScriptAliasMatch。它們由mod_alias模塊提供,該模塊用於提供簡單的路徑映射和重定向需求,更複雜的內容見URL重寫。 其中ScriptAlias用法和Alias完全 ...
主要包括Alias指令、AliasMatch、Redirect、RedirectMatch、ScriptAlias和ScriptAliasMatch。它們由mod_alias模塊提供,該模塊用於提供簡單的路徑映射和重定向需求,更複雜的內容見URL重寫。
其中ScriptAlias用法和Alias完全一樣,唯一不同的是ScriptAlias映射的目標路徑被認為是CGI文件或包含CGI文件的目錄,它們將會被cgi處理器處理執行。
1.1 處理順序
Redirect、RedirectMatch指令優先於Alias、AliasMatch進行處理;同類型的Redirect或Alias按照出現順序進行匹配,匹配到了立即停止。
例如:如果幾個指令按照下麵的順序出現:
Redirect1
Alias1
AliasMatch2
Alias3
RedirectMatch2
Redirect3
那麼它們匹配的順序為:Redirect1>RedirectMatch2>Redirect3>Alias1>AliasMatch2>Alias3。且一被匹配立即生效,後面的將被忽略。
1.2 Alias和AliasMatch
Alias指令用於將URL路徑映射到本地文件系統的路徑,且本地路徑不受DocumentRoot的限制。AliasMatch是正則版本的Alias。
Alias "/image" "/ftp/pub/image"
這將使得 http://myserver/image/foo.gif 的請求得到/ftp/pub/image/foo.gif,由於是精確匹配的,所以 http://myserver/imagefoo.gif 不會返回該路徑下的文件。但Alias有支持正則匹配的指令AliasMatch。
AliasMatch "(?i)^/image(.*)" "/ftp/pub/image$1"
Alias中如果URL部分包含了尾隨斜線,則映射路徑也應該包含斜線。例如下麵的例子,這時如果請求 http://myserver/icons ,將不會得到/usr/local/apache/icons/$DirectoryIndex。
Alias "/icons/" "/usr/local/apache/icons/"
設置了Alias後,需要考慮映射到的本地路徑的許可權是否放行。特別是對於DocumentRoot外的路徑,通常會因為< Directory "/">的拒絕而導致這些映射目標不能訪問。所以,對於這樣的映射路徑應該還需要為Alias指令配一個< Directory >容器放行。例如:
Alias "/image" "/ftp/pub/image"
<Directory "/ftp/pub/image">
Require all granted
</Directory>
如果Alias或AliasMatch出現在< Location >容器中,則它們只需要一個映射路徑作為參數即可,因為URL已經包含在容器路徑中。例如:
<Location "/image">
Alias "/ftp/pub/image"
</Location>
1.3 Redirect和RedirectMatch指令
它們告知客戶端資源已經轉移,讓它們重新發送對新路徑資源的HTTP請求。
Redirect [status] old-URL new-URL
舊的URL必須是以斜線"/"開頭的絕對路徑,新URL也必須是絕對路徑,但可以是包含了scheme://serverhost的絕對路徑,也可以是使用斜線開頭的絕對路徑。例如:
# 重定向到不同主機上
Redirect "/service" "http://foo2.example.com/service"
# 重定向到相同主機上
Redirect "/one" "/two"
如果客戶端請求 http://example.com/service/foo.txt ,將被告知重新去請求 http://foo2.example.com/service/foo.txt 。可以是包含GET參數的URL,例如 http://example.com/service/foo.pl?q=23&a=42 ,將重定向到 http://foo2.example.com/service/foo.pl?q=23&a=42 。但註意,POST方法會被無視。
如果沒有指定status參數,則重定向是臨時重定向(HTTP status 302)。對客戶端來說,此資源的路徑變動是臨時性的。以下幾個status參數可以返回各自不同的HTTP狀態碼:
- permanent:返回一個永久性重定向狀態碼(301),表示此資源的位置變動是永久性的。
- temp:返回一個臨時性重定向狀態碼(302),這是預設值。
- seeother:返回一個"參見"狀態碼(303),表示此資源已經被替代。
- gone:返回一個"已廢棄"狀態碼(410),表示此資源已經被永久性地刪除了。如果指定了這個狀態碼,則new-URL參數將被忽略。
status可以被指定為某個數值以返回其他指定狀態碼。如果此值在300-399之間,則必須提供new-URL參數,否則必須忽略new-URL,但不管如何,值必須是有效的http狀態碼值。
和alias指令一樣,如果寫在Location容器中,則old-URL忽略,因為它已經包含在location容器的路徑中。例如:
<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>