• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • mod_alias


    描述:提供映射文档树中 host 文件系统的不同部分以及 URL 重定向
    状态:基础
    模块标识符: alias_module
    源文件: mod_alias.c

    摘要

    该模块中包含的指令允许在请求到达服务器时操纵和控制 URL。别号和ScriptAlias 指令指令用于在 URL 和文件系统_path 之间进行 map。这允许不直接在DocumentRoot下的内容作为 web 文档树的一部分。 ScriptAlias 指令指令还具有将目标目录标记为仅包含 CGI 脚本的附加效果。

    重定向指令用于指示 clients 使用不同的 URL 发出新请求。它们通常在资源移动到新位置时使用。

    在<Location>或<LocationMatch>部分中使用别号,ScriptAlias 指令和重定向指令时,表达式语法可用于操作目标路径或 URL。

    mod_alias旨在处理简单的 URL 操作任务。对于更复杂的任务,例如操作查询 string,请使用mod_rewrite提供的工具。

    处理订单

    根据标准合并规则,处理在不同上下文中发生的别名和重定向与其他指令一样处理。但是当多个别名或重定向出现在同一个 context 中时(对于 example,在同一个<VirtualHost>部分中),它们将在特定的 order 中处理。

    首先,在处理别名之前处理所有重定向,因此匹配重定向或RedirectMatch的请求永远不会应用别名。其次,别名和重定向在它们出现在 configuration files 中的 order 中处理,第一个 match 优先。

    因此,当这些指令中的两个或多个适用于同一个 sub-path 时,必须首先在 order 中列出最具体的路径,以使所有指令生效。例如,以下 configuration 将按预期工作:

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

    但如果上述两个指令在 order 中被反转,/foo别号将始终

    当在<Location>或<LocationMatch>部分中使用别号,ScriptAlias 指令和重定向指令时,这些指令将优先于任何全局定义的别号,ScriptAlias 指令和重定向指令。

    Alias 指令

    描述: Maps 到文件系统位置的 URL
    句法:Alias[URL-path] file-path\|directory-path
    Context: server config,virtual host,目录
    状态:基础
    模块: mod_alias

    Alias指令允许将文档存储在除DocumentRoot之外的本地文件系统中。具有以 URL-path 开头的(%)路径的 URL 将映射到以 directory-path 开头的本地 files。即使在 case-insensitive 文件系统上,URL-path 也是 case-sensitive。

    Alias "/image" "/ftp/pub/image"
    

    http://example.com/image/foo.gif的请求将导致服务器 return 文件/ftp/pub/image/foo.gif。只匹配完整的路径段,因此上述别名不匹配http://example.com/imagefoo.gif的请求。有关使用正则表达式的更复杂匹配,请参阅AliasMatch指令。

    请注意,如果在 URL-path 上包含尾随/,则服务器将需要尾随/中 order 来扩展别名。也就是说,如果你使用

    Alias "/icons/" "/usr/local/apache/icons/"
    

    那么 URL /icons将没有别名,因为它缺少尾随/。同样,如果省略 URL-path 上的斜杠,那么你也必须从 file-path 中省略它。

    请注意,您可能需要指定涵盖别名目标的其他<Directory>部分。在检查<Directory>节之前发生别名,因此只有别名的目标受到影响。(注意,在执行别名之前<Location>部分是 run 一次,所以它们将 apply.)

    特别是,如果您在之外的目录中创建Alias,则可能需要明确允许访问目标目录。

    Alias "/image" "/ftp/pub/image"
    <Directory "/ftp/pub/image">
        Require all granted
    </Directory>
    

    URL-path 参数中的任何数字斜杠都匹配请求的 URL-path 中的任意数量的斜杠。

    如果在<Location>或<LocationMatch>部分中使用Alias指令,则省略 URL-path,并使用表达式语法解释 file-path。
    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 指令

    描述:使用正则表达式将 URL 添加到文件系统位置
    句法:AliasMatch regex file-path\|directory-path
    Context: server config,virtual host
    状态:基础
    模块: mod_alias

    该指令等同于别号,但使用常用表达,而不是简单的前缀匹配。提供的正则表达式与 URL-path 匹配,如果匹配,服务器将把任何带括号的匹配替换为给定的 string 并将其用作文件名。例如,要激活/icons目录,可以使用:

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

    提供全系列的正则表达式电源。对于 example,可以构造一个 URL-path 与 URL-path 匹配的别名:

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

    别号和AliasMatch之间的一个细微差别是别号会自动将 URI 的任何其他部分(通过匹配的部分)复制到右侧文件路径的末尾,而AliasMatch则不会。这意味着在几乎所有情况下,您都希望正则表达式从头到尾匹配整个请求 URI,并在右侧使用替换。

    换句话说,仅将别号更改为AliasMatch将不会产生相同的效果。至少,您需要将^添加到正则表达式的开头并将(.*)$添加到结尾,并将$1添加到替换的末尾。

    对于 example,假设您要将其替换为 AliasMatch:

    Alias "/image/" "/ftp/pub/image/"
    

    这不等同- 不要这样做!这会将/image/中任何位置的所有请求发送到/ftp/pub/image/:

    AliasMatch "/image/" "/ftp/pub/image/"
    

    这是你需要获得相同的效果:

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

    当然,使用AliasMatch是没有意义的,其中别号可以工作。 AliasMatch让你做更复杂的事情。例如,您可以从不同的目录中提供不同类型的 files:

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

    在来自此模块的指令与请求的 URL-path 进行比较之前,服务器将丢弃请求的 URL 中的多个前导斜杠。

    重定向指令

    描述:发送外部重定向,要求 client 获取不同的 URL
    句法:Redirect[status][URL-path] URL
    Context: server config,virtual host,directory,.htaccess
    覆盖: FileInfo
    状态:基础
    模块: mod_alias

    Redirect指令通过要求 client 在新位置重新获取资源,将旧 URL 映射为新 URL。

    旧的 URL-path 是以斜杠开头的 case-sensitive(%-decoded)路径。不允许相对路径。

    新 URL 可以是以 scheme 和主机名开头的绝对 URL,也可以是以斜杠开头的 URL-path。在后一种情况下,将添加当前服务器的 scheme 和主机名。

    然后,以 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将被丢弃。
    只匹配完整的路径段,因此上述 example 不匹配http://example.com/servicefoo.txt的请求。对于使用表达式语法进行更复杂的匹配,请省略 URL-path 参数,如下所述。或者,要使用正则表达式进行匹配,请参阅RedirectMatch指令。

    注意

    Redirect指令优先于别号和ScriptAlias 指令指令,与 configuration 文件中的 ordering 无关。位置内的Redirect指令优先于带有 URL-path 的Redirect和别号指令。

    如果没有给出 status 参数,则重定向将是“临时的”(HTTP 状态 302)。这向客户端指示资源已暂时移动。 status 参数可用于 return 其他 HTTP 状态代码:

    • 常驻
      返回永久重定向状态(301),指示资源已永久移动。

    • 温度
      返回临时重定向状态(302)。这是默认值。

    • seeother
      返回“See Other”状态(303),指示资源已被替换。

    • 走了
      返回“Gone”状态(410),指示资源已被永久删除。使用此状态时,应省略 URL 参数。

    通过将数字状态 code 作为状态的 value,可以返回其他状态代码。如果状态介于 300 和 399 之间,则必须存在 URL 参数。如果状态不在 300 和 399 之间,则必须省略 URL 参数。状态必须是 Apache HTTP Server 已知的有效 HTTP 状态 code(请参阅 http_protocol.c 中的 function send_error_response)。

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

    如果在省略 URL-path 的<Location>或<LocationMatch>部分中使用Redirect指令,则将使用表达式语法解释 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 指令

    描述:根据当前 URL 的正则表达式 match 发送外部重定向
    句法:RedirectMatch[status] regex URL
    Context: server config,virtual host,directory,.htaccess
    覆盖: FileInfo
    状态:基础
    模块: mod_alias

    该指令等同于重定向,但使用常用表达,而不是简单的前缀匹配。提供的正则表达式与 URL-path 匹配,如果匹配,服务器将把任何带括号的匹配替换为给定的 string 并将其用作文件名。例如,要将所有 GIF files 重定向到另一台服务器上的 like-named JPEG files,可以使用:

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

    与别号和AliasMatch之间的差异相关的考虑因素也适用于重定向和RedirectMatch之间的差异。有关详细信息,请参阅AliasMatch。

    RedirectPermanent 指令

    描述:发送外部永久重定向,要求 client 获取不同的 URL
    句法:RedirectPermanent URL-path URL
    Context: server config,virtual host,directory,.htaccess
    覆盖: FileInfo
    状态:基础
    模块: mod_alias

    该指令使 client 知道 Redirect 是永久性的(状态 301)。完全等同于Redirect permanent

    RedirectTemp 指令

    描述:发送外部临时重定向,要求 client 获取不同的 URL
    句法:RedirectTemp URL-path URL
    Context: server config,virtual host,directory,.htaccess
    覆盖: FileInfo
    状态:基础
    模块: mod_alias

    该指令使 client 知道 Redirect 只是临时的(状态 302)。完全等同于Redirect temp

    ScriptAlias 指令

    描述: Maps 到文件系统位置的 URL 并将目标指定为 CGI 脚本
    句法:ScriptAlias[URL-path] file-path\|directory-path
    Context: server config,virtual host,目录
    状态:基础
    模块: mod_alias

    ScriptAlias指令与别号指令具有相同的行为,除此之外它还将目标目录标记为包含将由mod_cgi的 cgi-script 处理程序处理的 CGI 脚本。具有以 URL-path 开头的 case-sensitive(%-decoded)路径的 URL 将映射到以第二个参数开头的脚本,该第二个参数是本地文件系统中的完整路径名。

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

    http://example.com/cgi-bin/foo的请求将导致服务器 run 脚本/web/cgi-bin/foo。这个 configuration 基本上相当于:

    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/中请求的所有 files 将由您配置的文件处理,这允许您使用自己的自定义处理程序。您可能希望将其用作 CGI 的 wrapper,以便您可以添加内容或其他一些定制操作。

    避免在DocumentRoot中使用 CGI 脚本更安全,以避免在 configuration 更改时意外泄露 source code。ScriptAlias通过映射 URL 并在同一时间指定 CGI 脚本使这变得容易。如果您确实选择将 CGI 脚本放在已经可以从 web 访问的目录中,请不要使用ScriptAlias。而是使用<Directory>,SetHandler和选项,如下所示:

    <Directory "/usr/local/apache2/htdocs/cgi-bin">
        SetHandler cgi-script
        Options ExecCGI
    </Directory>
    

    这是必要的,因为多个 URL-paths 可以 map 到同一文件系统位置,如果它们不受目录部分的限制,可能会绕过ScriptAlias并显示 CGI 脚本的 source code。
    如果在省略 URL-path 的<Location>或<LocationMatch>部分中使用ScriptAlias指令,则将使用表达式语法解释 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>
    

    参见

    • CGI 教程

    ScriptAliasMatch 指令

    描述:使用正则表达式将 URL 链接到文件系统位置,并将目标指定为 CGI 脚本
    句法:ScriptAliasMatch regex file-path\|directory-path
    Context: server config,virtual host
    状态:基础
    模块: mod_alias

    该指令等同于ScriptAlias 指令,但使用常用表达,而不是简单的前缀匹配。提供的正则表达式与 URL-path 匹配,如果匹配,服务器将把任何带括号的匹配替换为给定的 string 并将其用作文件名。例如,要激活标准/cgi-bin,可以使用:

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

    至于 AliasMatch,可提供全系列的正则表达式电源。对于 example,可以构造一个 URL-path 与 URL-path 匹配的别名:

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

    与别号和AliasMatch之间的差异相关的考虑因素也适用于ScriptAlias 指令和ScriptAliasMatch之间的差异。有关详细信息,请参阅AliasMatch。

    上篇:mod_actions

    下篇:mod_allowmethods