http路径映射和重定向

主要包括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"

这将使得 的请求得到/ftp/pub/image/foo.gif,由于是精确匹配的,所以 不会返回该路径下的文件。但Alias有支持正则匹配的指令AliasMatch。

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

Alias中如果URL部分包含了尾随斜线,则映射路径也应该包含斜线。例如下面的例子,这时如果请求 ,将不会得到/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"

如果客户端请求 ,将被告知重新去请求 。可以是包含GET参数的URL,例如 ?q=23&a=42 ,将重定向到 ?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>

本文永久更新链接地址

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/545f1c347299401ab22e243923a877d8.html