Apache Redirect Match 匹配重定向

从一个域名改到另一个域名,或者对服务器的目录结构进行调整时,你的用户还是从老的目录进来,就可能会遇到找不到文件,或是访问禁止等等问题。

这时候RedirectMatch就显得非常有用,如果你租用的虚拟主机是apache,那么恭喜你,你也可以使用目录下的.htaccess里设置 RedirectMatch。

语法: RedirectMatch [status] regex URL

regex 为 regular expressions 的缩写,具体参考 Apache 手册。

应用: 服务器配置, 虚拟主机, 目录, .htaccess文件

举例:

1) 将一个目录重定向到一个文件:

RedirectMatch 301 ^/lastdir$ /lastdir.html

2) 将A目录重定向到B目录:

RedirectMatch 301 ^/dir_a$ /dir_b

3) 将A目录下所有的文件重定向到B目录:

RedirectMatch 301 ^/dir_a/.* /dir_b

4) 将A目录下所有的文件重定向到B目录相对应的文件:

RedirectMatch 301 ^/dir_a/(.*) /dir_b/$1

$1表示上面圆括弧中的变量,如果有多个圆括弧,则按顺序为 $2,$3

5) 将A目录下所有的文件重定向到B服务器的C目录相对应的文件:

RedirectMatch 301 ^/dir_a/(.*) http://www.b.com/dir_c/$1

这个对有些原先使用个人空间,而现在有了自己的服务器或者虚拟主机的人来说非常有用,

比如原先是 www.wz.zj.cn/~mypage

而现在有了www.myweb.com 这个空间

那么就可以在原个人空间的目录下编辑 .htaccess 加入:

RedirectMatch 301 ^/~dir_a/(.*) http://www.mypage.com/$1

如果域名发生变更,可以这样:

RedirectMatch 301 ^(.*) http://www.newdomaim.com/$1

说明:

符号 ^ 表示匹配项的开始, 符号 $ 表示结束,符号 * 代表通配符,符号 () 定义变量,$1, $2 为变量名。

301,是状态码,表示永久重定向,另外还有:

302,临时重定向,如果不写状态码,则这个就是默认值。

303,系统会有一个页面,指出资源地址已经改变。

410,表示资源地址已经永久删除

Apache模块 mod_alias

说明 提供从文件系统的不同部分到文档树的映射和URL重定向
状态 基本(B)
模块名 alias_module
源文件 mod_alias.c

概述

此模块提供的指令可以操控作为请求到达服务器的URL。AliasScriptAlias指令用于在URL和文件系统路径之间实现映射,使不在DocumentRoot目录下的内容也能成为文档树的一部分,其中,ScriptAlias指令有更多一层的含义,它标明此目标目录下只有CGI脚本。

Redirect指令引导客户端以一个不同的URL产生一个新的请求,常用于一个资源被移动到一个新位置的时候。

mod_alias被设计成处理普通的URL操作。复杂的URL操作,比如处理请求字符串,请使用mod_rewrite提供的强大功能。

top

处理顺序

出现在不同作用域(context)中的别名指令以及重定向指令和其他指令一样,按照标准的合并规则进行处理。但是当多个别名指令或重定向指令出现在同一个作用域(context)中的时候(比如在同一个<VirtualHost>段),处理顺序就比较特别了:

首先,所有重定向指令都优先于别名指令被处理,因此一个匹配RedirectRedirectMatch的请求将永远不会被别名指令处理。其次,别名指令和重定向指令将按照他们在配置文件中出现的先后顺序进行匹配,并由最先匹配到的指令进行处理。

因为这个原因,当两个或两个以上的这些指令作用于同一个子路径时,你必须将最特殊的路径放在最前面,以便所有指令都能正确地生效。例如下面的例子将按照你原本的意愿正常工作:

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

但是,如果将上面两条指令的顺序颠倒,则后一条指令永远也得不到匹配的机会。

top

Alias 指令

说明 映射URL到文件系统的特定区域
语法 Alias URL-path file-path|directory-path
作用域 server config, virtual host
状态 基本(B)
模块 mod_alias

Alias指令使文档可以被存储在DocumentRoot以外的本地文件系统中。以(%已解码的)url-path路径开头的URL可以被映射到以directory-path开头的本地文件。

示例:

Alias /image /ftp/pub/image

对”http://myserver/image/foo.gif”的请求,服务器将返回”/ftp/pub/image/foo.gif”文件。因为仅匹配完整路径,所以上述例子不会匹配对”http://myserver/imagefoo.gif”的请求。对于使用正则表达式的匹配,请参见AliasMatch指令。

注意:如果url-path中有后缀”/”,则服务器要求有后缀”/”以扩展此别名。也就是说”Alias /icons/ /usr/local/apache/icons/“并不能对”/icons“实现别名。

注意,可能需要额外指定一个<Directory>段来覆盖别名的最终对象。由于只有出现在<Directory>段之前的别名才会被检测,所以它只对最终对象生效。(由于执行别名操作之前<Location>段会被首先扫描一次,所以它们也是有效的)

特别地,如果对在DocumentRoot之外的某个目录建立了一个Alias ,则可能需要明确的对目标目录设定访问权限。

示例:

Alias /image /ftp/pub/image
<Directory /ftp/pub/image>
Order allow,deny
Allow from all
</Directory>

top

AliasMatch 指令

说明 使用正则表达式映射URL到文件系统
语法 AliasMatch regex file-path|directory-path
作用域 server config, virtual host
状态 基本(B)
模块 mod_alias

这个指令与Alias等效,但是它使用了标准的正则表达式,而不是简单的前缀匹配。如果此正则表达式与URL-path相匹配,则服务器会把所匹配的括弧中的字符串替换到该指令所指定的目标字符串中,并视之为一个文件名。例如,要使用”/icons“目录,可以:

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

top

Redirect 指令

说明 发送一个外部重定向使客户端重定向到一个不同的URL
语法 Redirect [status] URL-path URL
作用域 server config, virtual host, directory, .htaccess
覆盖项 FileInfo
状态 基本(B)
模块 mod_alias

该指令将一个老URL映射为一个新URL,此新URL被返回到客户端使之重定向到一个新地址。

URL-path是一个(%已解码的)以”/”开头的(网络空间)绝对路径。新URL是一个(%已编码的)以”/”开头的(网络空间)绝对路径或者包含协议名和主机名的完整URL。当新URL不包含协议名和主机名时将使用与老URL-path相同的当前值。

这样,对任何以老URL-path开头的请求,将返回一个指向以新URL开头的重定向应答。

示例:

Redirect /service http://foo2.example.com/service

如果客户端请求”http://example.com/service/foo.txt”,则会被重定向到”http://foo2.example.com/service/foo.txt”。因为仅匹配完整路径,所以上述例子不会匹配”http://example.com/servicefoo.txt”请求。对于使用正则表达式的匹配,请参见RedirectMatch指令。

注意

重定向指令总是优先于Alias和ScriptAlias指令,而无论他们在配置文件中的顺序如何。

如果没有指定status参数,则重定向是”临时的”(HTTP status 302)。也就是对客户端来说,此资源的位置变动是临时性的。此status参数可以返回以下HTTP状态码:

permanent
返回一个永久性重定向状态码(301),表示此资源的位置变动是永久性的。
temp
返回一个临时性重定向状态码(302),这是默认值。
seeother
返回一个”参见”状态码(303),表示此资源已经被替代。
gone
返回一个”已废弃”状态码(410),表示此资源已经被永久性地删除了。如果指定了这个状态码,则URL参数将被忽略。

status可以被指定为数字状态以返回其他状态码。如果此状态在300-399之间,则必须提供URL参数,否则将被忽略。注意,此状态码必须是Apache已知的(参见http_protocol.c中的send_error_response函数)。

示例:

Redirect permanent /one http://example.com/two
Redirect 303 /three http://example.com/other

top

RedirectMatch 指令

说明 基于正则表达式匹配对当前的URL发送一个外部重定向
语法 RedirectMatch [status] regex URL
作用域 server config, virtual host, directory, .htaccess
覆盖项 FileInfo
状态 基本(B)
模块 mod_alias

该指令与Redirect等效,但是它使用了标准的正则表达式,而不是简单的前缀匹配。如果regex与URL-path相匹配,则服务器会把所匹配的括弧中的字符串替换到该指令所指定的目标字符串中,并视之为一个文件名。例如,重定向所有GIF文件到另一个服务器上同名的JPEG文件,可以:

RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg

top

RedirectPermanent 指令

说明 发送一个外部永久重定向使客户端重定向到一个不同的URL
语法 RedirectPermanent URL-path URL
作用域 server config, virtual host, directory, .htaccess
覆盖项 FileInfo
状态 基本(B)
模块 mod_alias

此指令告知客户端此重定向是永久性的(status 301)。与”Redirect permanent“等效。

top

RedirectTemp 指令

说明 发送一个外部临时重定向使客户端重定向到一个不同的URL
语法 RedirectTemp URL-path URL
作用域 server config, virtual host, directory, .htaccess
覆盖项 FileInfo
状态 基本(B)
模块 mod_alias

此指令告知客户端此重定向只是临时性的(status 302)。与”Redirect temp“等效。

top

ScriptAlias 指令

说明 映射一个URL到文件系统并视之为CGI脚本
语法 ScriptAlias URL-path file-path|directory-path
作用域 server config, virtual host
状态 基本(B)
模块 mod_alias

ScriptAlias指令的行为与Alias指令相同,但同时它又标明此目录中含有应该由cgi-script处理器处理的CGI脚本。以URL-path开头的(%已解码的)的URL会被映射到由第二个参数指定的具有完整路径名的本地文件系统中的脚本。

示例:

ScriptAlias /cgi-bin/ /web/cgi-bin/

http://myserver/cgi-bin/foo的请求会引导服务器执行/web/cgi-bin/foo脚本。

top

ScriptAliasMatch 指令

说明 使用正则表达式映射一个URL到文件系统并视之为CGI脚本
语法 ScriptAliasMatch regex file-path|directory-path
作用域 server config, virtual host
状态 基本(B)
模块 mod_alias

该指令与ScriptAlias等效,但是它使用了标准的正则表达式,而不是简单的前缀匹配。如果regex与URL-path相匹配,则服务器会把所匹配的括弧中的字符串替换到该指令所指定的目标字符串中,并视之为一个文件名。例如,要使用标准的/cgi-bin ,可以:

ScriptAliasMatch ^/cgi-bin(.*) /usr/local/apache/cgi-bin$1