Aapche 主配置文件

Apache 重写相关指令作用域

Apache 模块 mod_rewrite


说明 一个基于一定规则的实时重写URL请求的引擎
状态 扩展(E)
模块名 rewrite_module
源文件 mod_rewrite.c
兼容性 仅在 Apache 1.3 及以后的版本中可用

描述

  •  mod_rewrite 模块提供了一个基于正则表达式分析器的重写引擎来实时重写 URL 请求。
  • 它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。
  • 此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。
  • mod_rewrite 模块可以操作 URL 的所有部分(包括路径信息部分),在服务器级的 (httpd.conf) 和目录级的 (.htaccess) 配置都有效,还可以生成最终请求字符串。
  • 此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。但是,所有这些功能和灵活性带来一个问题,那就是复杂性,因此,不要指望一天之内就能看懂整个模块。
  • 更多的讨论、细节、示例,请查看详细的 URL重写文档

RewriteBase 指令 目录级URL重写


说明 设置目录级重写的基准URL
语法 RewriteBase URL-path
默认值 参见使用方法
作用域 directory, .htaccess
覆盖项 FileInfo
状态 扩展(E)
模块 mod_rewrite
  • RewriteBase 指令显式地设置了目录级重写的基准 URL。该 RewriteBase 指令指定用于 RewriteRule 替换相对路径的每个目录(htaccess)指令的 URL 前缀
    • 原始请求和替换位于其下方 DocumentRoot (而不是通过其他方式可达,例如 Alias)。
    • 包含 RewriteRule 的目录的文件系统路径, 后缀的相对替换也有效, 作为服务器上的 URL 路径 (这是罕见的)。
    • 在Apache HTTP Server 2.4.16和以后的版本中,当通过 Alias  mod_userdir 映射请求时,可以省略该指令。
  • 在下文中,你将看到 RewriteRule 可以用于目录级的配置文件中 (.htaccess) 并在局部范围内起作用,即规则实际处理的只是剥离了本地路径前缀的一部分。
  • 处理结束后,这个路径会被自动地附着回去。默认值是 “RewriteBase physical-directory-path”。

目录重写

  • 重写引擎可以在 .htaccess 文件和 部分中使用,要启用重写引擎,需要设置 RewriteEngine On 并且 Options FollowSymLinks 必须启用。
  • 如果管理员已禁用 FollowSymLinks 用户目录的覆盖,则无法使用重写引擎。出于安全原因,需要此限制。
  • 有关将 RewriteBase 哪些前缀添加回相对替换的更多信息,请参阅该指令。
  • 如果希望匹配每个目录 (htaccess) RewriteRule 中的完整url路径,请在 RewriteCond 中使用 %{REQUEST_URI} 变量。
  • 删除的前缀始终以斜杠结尾,这意味着匹配对于从不具有前导斜杠的字符串 。因此,模式与 ^/ 从未在每个目录上下文匹配。 虽然在语法上允许重写规则  部分(包括它们的正则表达式对应部分),但这绝不是必需的,并且不受支持。在这些背景下打破的一个可能特征是相对替代。
  • RewriteBase 配置 目录URL重写 示例

RewriteRule 指令 重写规则


说明 为重写引擎定义重写规则
语法 RewriteRule Pattern Substitution [flags]
作用域 server config, virtual host, directory, .htaccess
覆盖项 FileInfo
状态 扩展(E)
模块 mod_rewrite
兼容性 cookie-flag在Apache 2.0.40及以后的版本中可用
  • RewriteRule 指令是重写引擎的根本。此指令可以多次使用。每个指令定义一个简单的重写规则。
  • 这些规则的定义顺序尤为重要――在运行时,规则是按这个顺序逐一生效的。
  • Pattern 是一个作用于当前 URL 的 perl 兼容的正则表达式。”当前URL” 是指该规则生效时刻的URL的值。它可能与被请求的URL截然不同,因为其他规则可能在此之前已经发生匹配并对它做了改动。

正则表达式的一些用法示例:


文本
. 任意一个单字符
[chars] 字符类: “chars”中的任意一个字符
[^chars] 字符类: 不在”chars”中的字符
text1|text2 选择: text1 或 text2
量词
? 前面的字符出现 0 或 1 次
* 前面的字符出现 0 或 N 次(N > 0)
+ 前面的字符出现 1 或 N 次(N > 1)
分组
(text) text 组
(常用于设置一个选择的边界,或用于生成后引用:
在RewriteRule中可以用 $N 引用第N个分组)
^ 锚定到行首
$ 锚定到行尾
转义
\c 对给定的字符c进行转义
(比如对”.”进行转义,等等)

有关正则表达式的一些提示,请参阅mod_rewrite简介。

 mod_rewrite 中,NOT(‘!’) 字符也可以作为可能的模式前缀。这使您可以否定一个模式;例如:” ‘如果当前URL与此模式不匹配。这可以用于特殊情况,在这种情况下更容易匹配负模式,或者作为最后一个默认规则。

file-system path

指定要传递给客户端的资源文件系统上的位置。当在服务器 (虚拟主机) 上下文中配置规则并且替换中的路径的第一个组件存在于文件系统中时, 替换仅作为文件系统路径处理。

URL-path

要服务的资源的 DocumentRoot 相对路径。请注意, mod_rewrite 尝试通过检查路径的第一段是否存在于文件系统的 根 中来猜测您是否指定了文件系统路径或 URL 路径。
例如 /www/file.html 指定了 Substitution 字符串那么这将被视为URL路径。然后,除非在根目录或文件系统中存在一个名为 www 的目录(或者,在.htaccess文件中使用相对于 document root 的重写时)。则它将被视为url路径,在这种情况下,它将被视为文件系统路径。如果您希望将其他 url 映射指令(例如别名)应用于生成的url路径,请使用下面描述的[PT]标志。

Absolute URL

如果指定了绝对 URL,mod_rewrite 将检查主机名是否与当前主机匹配。如果是,则删除 scheme 和 主机名,并将结果路径视为url路径。
否则,将对指定的 URL 执行外部重定向。要强制外部重定向回当前主机,请参阅[R]下面的标志。

– (dash)

“-” 符号表示不应该执行任何替换(现有路径未被修改)。当需要在不更改路径的情况下应用标志(见下面)时,可以使用此方法。

  • 除了纯文本外,Substitution 字符串还可以包含:
    1. $N 对 RewriteRule 模式的反引用()
    2. 反向引用 (%N) 到最后一个匹配的 RewriteCond 模式。
    3. 服务器变量,如规则条件 test-strings (%{VARNAME})
    4. 映射函数调用 (${mapname:key|default})
  • 反向引用是 $N (N=0.. .9) 形式的标识符,它将被匹配模式的第N组的内容所取代。
  • 服务器变量与 RewriteCond 指令的 TestString 是相同的。
  • 映射函数来自 RewriteMap 指令,并在其中进行了解释。这三种类型的变量按上面的顺序展开。

 

  • 重写规则应用于以前重写规则的结果,其顺序在配置文件中定义。
  • url 路径或文件系统路径(参见“匹配什么?”) 替换完全被替换,重写过程继续,直到所有规则都被应用,或者被 L 标志或其他暗示立即终止的标志 (如 END 或 F )显式终止。

此外,可以将 [flags] 作为 RewriteRule 指令的第三个参数设置为要执行的特殊操作。

[Flags1, Flags2] 是一个用逗号分隔的列表,用方括号括住了下表中的任何一个标志。重写标志文档中有关于每个标志的更多细节和示例。

Flags (标签)表 示例


Flag and syntax Function
B 在 应用转换之前,在反向引用中转义非字母数字字符。细节 …(http://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_b)
backrefnoplus|BNP 如果反向引用被转义,则应将空格转义为%20而不是+。当反向引用将用于路径组件而不是查询字符串时很有用。细节 …
chain|C 规则遵循以下规则。如果规则失败,将跳过链接到它的规则。细节 …
cookie|CO=NAME:VAL 在客户端浏览器中设置cookie。完整语法为:CO = NAME:VAL:domain [:lifetime [:path [:secure [:httponly ]]]] 详细信息……
discardpath|DPI 导致重写的URI的PATH_INFO部分被丢弃。细节 …
END 立即停止重写过程,不再应用任何规则。还可以防止在每个目录和.htaccess上下文中进一步执行重写规则。(2.3.9及更高版本中提供) 详细信息……
env|E=[!]VAR[:VAL] 导致设置环境变量VAR(如果提供,则为VAL)。表格 !VAR导致环境变量VAR未设置。 细节 …
forbidden|F 返回对客户端浏览器的403 FORBIDDEN响应。 细节 …
gone|G 返回对客户端浏览器的410 GONE响应。细节 …
Handler|H=Content-handler 导致生成的URI被发送到指定的 Content-handler进行处理。细节 …
last|L 立即停止重写过程,不再应用任何规则。特别注意每个目录和.htaccess上下文的注意事项(另请参阅END标志)。细节 …
next|N 重新运行重写过程,从第一个规则开始,使用规则集的结果作为起点。细节 …
nocase|NC 使模式比较不区分大小写。 细节 …
noescape|NE 防止mod_rewrite在重写结果中应用十六进制转义特殊字符。细节 …
nosubreq|NS 如果当前请求是内部子请求,则跳过规则。细节 …
proxy|P 强制将替换URL作为代理请求在内部发送。细节 …
passthrough|PT 强制将生成的URI传递回URL映射引擎,以处理其他URI到文件名的转换器,例如Alias或 Redirect。细节 …
qsappend|QSA 将原始请求URL中的任何查询字符串追加到重写目标中创建的任何查询字符串。细节…
qsdiscard|QSD 丢弃附加到传入URI的任何查询字符串。 细节 …
qslast|QSL 将最后一个(最右侧)问号解释为查询字符串分隔符,而不是通常使用的第一个(最左侧)。可在2.4.19及更高版本中使用。 细节 …
redirect|R[=code] 强制外部重定向,可选择使用指定的HTTP状态代码。细节 …
skip|S=num 如果当前规则匹配,则告知重写引擎跳过下一个num规则。细节 …
type|T=MIME-type 强制将目标文件的MIME类型指定为指定的类型。细节 …

 

  • 以下是所有可能的替换组合及其含义:
  • 在服务器级配置中 (httpd.conf) 对指定的请求 “GET /somepath/pathinfo”:

给定的规则 新的参数 得到的替换字符串
^/somepath(.*) otherpath$1 非法,不被支持
^/somepath(.*) otherpath$1 [R]
^/somepath(.*) otherpath$1 [P] 非法,不被支持
^/somepath(.*) /otherpath$1 /otherpath/pathinfo
^/somepath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo 
通过外部重定向
^/somepath(.*) /otherpath$1 [P] 毫无意义,不被支持
^/somepath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^/somepath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo 
通过外部重定向
^/somepath(.*) http://thishost/otherpath$1 [P] 毫无意义,不被支持
^/somepath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo 
通过外部重定向
^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo 
通过外部重定向 ([R]标记是多余的)
^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo 
通过内部代理
  • 在 /somepath 的目录级配置中 (也就是 /physical/path/to/somepath/.htacccess 文件中含有:RewriteBase /somepath)
  • 对指定的请求”GET /somepath/localpath/pathinfo”:

给定的规则 新的参数 得到的替换字符串
^localpath(.*) otherpath$1 /somepath/otherpath/pathinfo
^localpath(.*) otherpath$1 [R] http://thishost/somepath/otherpath/pathinfo 
通过外部重定向
^localpath(.*) otherpath$1 [P] 毫无意义,不被支持
^localpath(.*) /otherpath$1 /otherpath/pathinfo
^localpath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo 
通过外部重定向
^localpath(.*) /otherpath$1 [P] 毫无意义,不被支持
^localpath(.*) http://thishost/otherpath$1 /otherpath/pathinfo
^localpath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo 
通过外部重定向
^localpath(.*) http://thishost/otherpath$1 [P] 毫无意义,不被支持
^localpath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo 
通过外部重定向
^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo 
通过外部重定向 
([R]标记是多余的)
^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo 
通过内部代理
  • RewriteRule 配置外部重定向规则

Redirect 指令 重定向一个内部或外部 URL


说明 发送一个外部重定向使客户端重定向到一个不同的URL
语法 Redirect [status] URL-path URL
作用域 server config, virtual host, directory, .htaccess
覆盖项 FileInfo
状态 基本(B)
模块 mod_alias
  • 该指令将一个老 URL 映射为一个新 URL,此新 URL 被返回到客户端使之重定向到一个新地址。
  • 老 URL-path 是一个(% 已解码的) 以 “/” 开头的 (网络空间)绝对路径。
  • 新 UR L是一个 (% 已编码的) 以 “/” 开头的 (网络空间) 绝对路径或者包含协议名和主机名的完整 URL。
  • 当新 URL 不包含协议名和主机名时将使用与老 URL-path 相同的当前值。
  • 这样,对任何以老 URL-path 开头的请求,将返回一个指向以新 URL 开头的重定向应答。
  • 示例:

 重定向指令总是优先于 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函数)。
  • 示例:

发表评论