On this page
Apache 模块 mod_alias
Description: | 提供在文档树中 Map 主机文件系统的不同部分以及 URL 重定向的功能 |
---|---|
Status: | Base |
Module Identifier: | alias_module |
Source File: | mod_alias.c |
Summary
此模块中包含的指令允许在请求到达服务器时对 URL 进行操纵和控制。 Alias和ScriptAlias伪指令用于在 URL 和文件系统路径之间进行 Map。这允许不直接位于DocumentRoot下的内容用作 Web 文档树的一部分。 ScriptAlias指令还具有将目标目录标记为仅包含 CGI 脚本的效果。
Redirect指令用于指示 Client 端使用其他 URL 发出新请求。当资源移至新位置时,通常会使用它们。
在<Location>或<LocationMatch>节中使用Alias,ScriptAlias和Redirect伪指令时,可以使用expression syntax操纵目标路径或 URL。
mod_alias用于处理简单的 URL 操作任务。对于更复杂的任务,例如处理查询字符串,请使用mod_rewrite提供的工具。
处理 Sequences
根据标准merging rules,像其他指令一样处理在不同上下文中发生的别名和重定向。但是,如果在同一上下文中(例如,在同一<VirtualHost>部分中)发生多个别名或重定向,则会以特定 Sequences 对其进行处理。
首先,在处理别名之前将处理所有重定向,因此,匹配Redirect或RedirectMatch的请求将永远不会应用别名。其次,别名和重定向按照它们在配置文件中出现的 Sequences 进行处理,第一个匹配项优先。
因此,当两个或多个这些指令应用于同一子路径时,必须首先列出最特定的路径,以使所有指令均生效。例如,以下配置将按预期工作:
Alias "/foo/bar" "/baz"
Alias "/foo" "/gaq"
但是,如果按 Sequences 颠倒了以上两个指令,则/foo
Alias将始终在/foo/bar
Alias之前匹配,因此后一个指令将被忽略。
在<Location>或<LocationMatch>节中使用Alias,ScriptAlias和Redirect伪指令时,这些伪指令将优先于任何全局定义的Alias,ScriptAlias和Redirect伪指令。
Alias Directive
Description: | 将 URL Map 到文件系统位置 |
---|---|
Syntax: | Alias [URL-path] file-path|directory-path |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Base |
Module: | mod_alias |
Alias
指令允许将文档存储在本地文件系统中,而不是DocumentRoot下。以(%解码)路径以 URL-path 开头的 URL 将被 Map 到以 directory-path 开头的本地文件。 URL 路径区分大小写,即使在不区分大小写的文件系统上也是如此。
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/"
那么网址/icons
将不会被别名,因为它缺少后缀/。同样,如果省略 URL 路径上的斜杠,则还必须从文件路径中省略它。
请注意,您可能需要指定其他<Directory>部分,这些部分涵盖别名的“目标”。别名在检查<Directory>部分之前发生,因此仅别名的目标受到影响。 (但是请注意,<Location>部分在执行别名之前先运行一次,因此它们将适用。)
特别是,如果要在DocumentRoot之外的目录中创建Alias
,则可能需要显式允许访问目标目录。
Alias "/image" "/ftp/pub/image"
<Directory "/ftp/pub/image">
Require all granted
</Directory>
URL-path 参数中的任何数字斜杠与请求的 URL-path 中的任何斜杠匹配。
如果在<Location>或<LocationMatch>节中使用Alias
指令,则将省略 URL 路径,并使用expression syntax解释文件路径。
该语法在 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>
AliasMatch Directive
Description: | 使用正则表达式将 URL Map 到文件系统位置 |
---|---|
Syntax: | AliasMatch regex file-path|directory-path |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_alias |
此伪指令等效于Alias,但使用regular expressions,而不是简单的前缀匹配。提供的正则表达式与 URL 路径匹配,如果匹配,则服务器会将所有带括号的匹配替换为给定的字符串,并将其用作文件名。例如,要激活/icons
目录,可以使用:
AliasMatch "^/icons(/|$)(.*)" "/usr/local/apache/icons$1$2"
完整的regular expression电源范围。例如,可以使用 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"
当然,使用AliasMatch在Alias可行的地方毫无意义。 AliasMatch可让您做更复杂的事情。例如,您可以提供来自不同目录的不同类型的文件:
AliasMatch "^/image/(.*)\.jpg$" "/files/jpg.images/$1.jpg"
AliasMatch "^/image/(.*)\.gif$" "/files/gif.images/$1.gif"
在将来自此模块的指令与请求的 URL 路径进行比较之前,服务器会丢弃请求的 URL 中的多个前导斜杠。
Redirect Directive
Description: | 发送外部重定向,要求 Client 端获取其他 URL |
---|---|
Syntax: | Redirect [status] [URL-path] URL |
Context: | 服务器配置,虚拟主机,目录,.htaccess |
Override: | FileInfo |
Status: | Base |
Module: | mod_alias |
Redirect
指令通过要求 Client 端在新位置重新获取资源,将旧的 URL Map 到新的 URL。
旧的* URL-path *是区分大小写(%解码)的路径,以斜杠开头。不允许使用相对路径。
新的* URL *可以是以方案和主机名开头的绝对 URL,也可以是以斜杠开头的 URL 路径。在后一种情况下,将添加当前服务器的方案和主机名。
然后,任何以* URL-path 开头的请求都将在目标 URL 的位置向 Client 端返回重定向请求。匹配的 URL-path *之外的其他路径信息将附加到目标 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"
如果 Client 端请求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
s 将被丢弃。
仅匹配完整的路径段,因此上面的示例将不匹配对http://example.com/servicefoo.txt
的请求。要使用expression syntax进行更复杂的匹配,请如下所述省略 URL-path 参数。另外,要使用正则表达式进行匹配,请参见RedirectMatch指令。
Note
Redirect
指令优先于Alias和ScriptAlias指令,而不考虑它们在配置文件中的 Sequences。位置内的Redirect
指令优先于具有 URL 路径的Redirect
和Alias指令。
如果未提供状态参数,则重定向将为“临时”(HTTP 状态 302)。这向 Client 端指示资源已临时移动。 status 参数可用于返回其他 HTTP 状态代码:
permanent
- 返回永久重定向状态(301),指示资源已永久移动。
temp
- 返回临时重定向状态(302)。这是默认值。
seeother
- 返回“查看其他”状态(303),指示资源已被替换。
gone
- 返回“ Gone”状态(410),指示资源已被永久删除。使用此状态时,应省略 URL 参数。
通过将数字状态代码作为 status 的值,可以返回其他状态代码。如果状态在 300 到 399 之间,则必须存在 URL 参数。如果状态为 300 到 399 之间的* not *,则必须省略 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 路径,则将使用expression syntax来解释 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>
RedirectMatch Directive
Description: | 根据当前网址的正则表达式匹配发送外部重定向 |
---|---|
Syntax: | RedirectMatch [status] regex URL |
Context: | 服务器配置,虚拟主机,目录,.htaccess |
Override: | FileInfo |
Status: | Base |
Module: | mod_alias |
此伪指令等效于Redirect,但使用regular expressions,而不是简单的前缀匹配。提供的正则表达式与 URL 路径匹配,如果匹配,则服务器会将所有带括号的匹配替换为给定的字符串,并将其用作文件名。例如,要将所有 GIF 文件重定向到另一台服务器上的同名 JPEG 文件,则可以使用:
RedirectMatch "(.*)\.gif$" "http://other.example.com$1.jpg"
与Alias和AliasMatch之间的差异有关的注意事项也适用于Redirect和RedirectMatch之间的差异。有关详情,请参见AliasMatch。
RedirectPermanent Directive
Description: | 发送外部永久重定向,要求 Client 端获取其他 URL |
---|---|
Syntax: | RedirectPermanent URL-path URL |
Context: | 服务器配置,虚拟主机,目录,.htaccess |
Override: | FileInfo |
Status: | Base |
Module: | mod_alias |
该指令使 Client 端知道重定向是永久的(状态 301)。完全等效于Redirect permanent
。
RedirectTemp Directive
Description: | 发送外部临时重定向,要求 Client 端获取其他 URL |
---|---|
Syntax: | RedirectTemp URL-path URL |
Context: | 服务器配置,虚拟主机,目录,.htaccess |
Override: | FileInfo |
Status: | Base |
Module: | mod_alias |
该指令使 Client 端知道重定向只是临时的(状态 302)。完全等效于Redirect temp
。
ScriptAlias Directive
Description: | 将 URL Map 到文件系统位置,并将目标指定为 CGI 脚本 |
---|---|
Syntax: | ScriptAlias [URL-path] file-path|directory-path |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Base |
Module: | mod_alias |
ScriptAlias
指令与Alias指令具有相同的行为,除了ScriptAlias
指令还将目标目录标记为包含将由mod_cgi的 cgi-script 处理程序处理的 CGI 脚本。具有以 URL 路径开头的区分大小写(%解码)路径的 URL 将被 Map 到以第二个参数开头的脚本,该参数是本地文件系统中的完整路径名。
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 的包装,以便可以添加内容或其他定制操作。
Warning
最好避免将 CGI 脚本放在DocumentRoot下,以免在配置发生更改时意外泄露其源代码。 ScriptAlias
通过 Map URL 并同时指定 CGI 脚本,使此操作变得容易。如果您确实选择将 CGI 脚本放在可从 Web 访问的目录中,请不要使用ScriptAlias
。而是使用<Directory>,SetHandler和Options,如下所示:
<Directory "/usr/local/apache2/htdocs/cgi-bin">
SetHandler cgi-script
Options ExecCGI
</Directory>
这是必要的,因为多个 URL 路径可以 Map 到同一文件系统位置,从而可能绕过ScriptAlias
并显示 CGI 脚本的源代码(如果它们不受Directory部分的限制)。
如果在<Location>或<LocationMatch>部分中使用了ScriptAlias
指令而省略了 URL 路径,则将使用expression syntax来解释 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>
See also
ScriptAliasMatch Directive
Description: | 使用正则表达式将 URL Map 到文件系统位置,并将目标指定为 CGI 脚本 |
---|---|
Syntax: | ScriptAliasMatch regex file-path|directory-path |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_alias |
此伪指令等效于ScriptAlias,但使用regular expressions,而不是简单的前缀匹配。提供的正则表达式与 URL 路径匹配,如果匹配,则服务器会将所有带括号的匹配替换为给定的字符串,并将其用作文件名。例如,要激活标准/cgi-bin
,可以使用:
ScriptAliasMatch "^/cgi-bin(.*)" "/usr/local/apache/cgi-bin$1"
至于 AliasMatch,则可以使用regular expression电源的全部范围。例如,可以使用 URL 路径的大小写不敏感匹配来构造别名:
ScriptAliasMatch "(?i)^/cgi-bin(.*)" "/usr/local/apache/cgi-bin$1"
与Alias和AliasMatch之间的差异有关的注意事项也适用于ScriptAlias和ScriptAliasMatch之间的差异。有关详情,请参见AliasMatch。