<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_rewrite

可用语言:  en  |  fr 

描述提供基于规则的重写引擎,用于动态重写请求的 URL
状态扩展
模块标识符rewrite_module
源文件mod_rewrite.c

摘要

mod_rewrite 模块使用基于规则的重写引擎,基于 PCRE 正则表达式解析器,动态重写请求的 URL。默认情况下,mod_rewrite 将 URL 映射到文件系统路径。但是,它也可以用于将一个 URL 重定向到另一个 URL,或调用内部代理获取。

mod_rewrite 提供了一种灵活且强大的方法,可以使用无限数量的规则来操作 URL。每个规则可以有无限数量的附加规则条件,允许您根据服务器变量、环境变量、HTTP 标头或时间戳重写 URL。

mod_rewrite 对完整的 URL 路径进行操作,包括路径信息部分。重写规则可以在 httpd.conf.htaccess 中调用。重写规则生成的路径可以包含查询字符串,也可以导致内部子处理、外部请求重定向或内部代理吞吐量。

更多详细信息、讨论和示例,请参阅 详细的 mod_rewrite 文档

Support Apache!

主题

指令

错误修复清单

另请参阅

top

日志记录

mod_rewritetrace1trace8 日志级别提供其操作的详细日志记录。可以使用 LogLevel 指令为 mod_rewrite 特定设置日志级别:最高级别 debug 不会记录任何操作,而 trace8 表示实际上所有操作都会被记录。

mod_rewrite 使用高跟踪日志级别会极大地降低 Apache HTTP Server 的速度!仅在调试时使用高于 trace2 的日志级别!

示例

LogLevel alert rewrite:trace3

RewriteLog

熟悉早期版本的 mod_rewrite 的人无疑会寻找 RewriteLogRewriteLogLevel 指令。此功能已完全被上面提到的新的每个模块日志记录配置所取代。

要仅获取 mod_rewrite 特定的日志消息,请将日志文件通过 grep 传递

tail -f error_log|fgrep '[rewrite:'

top

RewriteBase 指令

描述设置每个目录重写的基本 URL
语法RewriteBase URL-path
默认
上下文目录,.htaccess
覆盖FileInfo
状态扩展
模块mod_rewrite

RewriteBase 指令指定用于每个目录(htaccess)RewriteRule 指令的基本 URL,这些指令替换相对路径。

当您在每个目录(htaccess)上下文中使用替换中的相对路径时,此指令是必需的,除非以下任一条件为真

在下面的示例中,RewriteBase 是必需的,以避免重写到 http://example.com/opt/myapp-1.2.3/welcome.html,因为资源不是相对于文档根目录的。此错误配置通常会导致服务器在文档根目录下查找“opt”目录。

DocumentRoot "/var/www/example.com"
AliasMatch "^/myapp" "/opt/myapp-1.2.3"
<Directory "/opt/myapp-1.2.3">
    RewriteEngine On
    RewriteBase "/myapp/"
    RewriteRule "^index\.html$"  "welcome.html"
</Directory>
top

RewriteCond 指令

描述定义重写将发生的条件
语法RewriteCond TestString CondPattern [flags]
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态扩展
模块mod_rewrite

RewriteCond 指令定义规则条件。一个或多个 RewriteCond 可以位于 RewriteRule 指令之前。只有当 URI 的当前状态与其模式匹配,并且满足这些条件时,才会使用以下规则。

TestString 是一个字符串,除了纯文本之外,它还可以包含以下扩展结构

如果 TestString 的特殊值为 expr,则 CondPattern 将被视为 ap_expr。如果未给出 novary 标志,则表达式中引用的 HTTP 标头将被添加到 Vary 标头中。

您应该注意的其他事项

  1. 变量 SCRIPT_FILENAME 和 REQUEST_FILENAME 包含相同的值 - Apache HTTP Server 的内部 request_rec 结构的 filename 字段的值。第一个名称是众所周知的 CGI 变量名称,而第二个名称是 REQUEST_URI 的适当对应项(它包含 request_recuri 字段的值)。

    如果发生了替换并且重写继续,则这两个变量的值将相应更新。

    如果在每个服务器上下文中使用(,在请求映射到文件系统之前),SCRIPT_FILENAME 和 REQUEST_FILENAME 无法包含完整的本地文件系统路径,因为在此处理阶段路径未知。在这种情况下,这两个变量最初将包含 REQUEST_URI 的值。为了在每个服务器上下文中获取请求的完整本地文件系统路径,请使用基于 URL 的前瞻 %{LA-U:REQUEST_FILENAME} 来确定 REQUEST_FILENAME 的最终值。

  2. %{ENV:variable},其中 variable 可以是任何环境变量,也可用。这是通过 Apache httpd 的内部结构查找的(如果在那里找不到),则通过 Apache httpd 服务器进程的 getenv() 查找。
  3. %{SSL:variable},其中variableSSL 环境变量 的名称,无论是否加载 mod_ssl 都可以使用,但如果未加载,则始终扩展为空字符串。例如:%{SSL:SSL_CIPHER_USEKEYSIZE} 可能扩展为 128。即使没有设置 SSLOptions 指令的 StdEnvVars 选项,这些变量也可用。
  4. %{HTTP:header},其中header 可以是任何 HTTP MIME 标头名称,始终可用于获取 HTTP 请求中发送的标头的值。例如:%{HTTP:Proxy-Connection} 是 HTTP 标头 ``Proxy-Connection:'' 的值。

    如果在条件中使用 HTTP 标头,则如果条件对请求求值为真,则此标头将添加到响应的 Vary 标头中。如果条件对请求求值为假,则不会添加它。将 HTTP 标头添加到响应的 Vary 标头中对于正确缓存是必需的。

    必须记住,在 'ornext|OR' 标志的情况下,条件遵循短路逻辑,因此某些条件可能根本不会被评估。

  5. %{LA-U:variable} 可用于前瞻,前瞻执行内部(基于 URL 的)子请求以确定variable 的最终值。这可用于访问在当前阶段不可用但在稍后阶段将设置的重写变量。

    例如,要根据服务器上下文(httpd.conf 文件)中的 REMOTE_USER 变量进行重写,必须使用 %{LA-U:REMOTE_USER} - 此变量由授权阶段设置,该阶段在 URL 转换阶段(mod_rewrite 在此阶段运行)之后进行。

    另一方面,由于 mod_rewrite 通过 API 的 Fixup 阶段实现其每个目录上下文(.htaccess 文件),并且授权阶段在此阶段之前进行,因此您只需在该上下文中使用 %{REMOTE_USER} 即可。

  6. %{LA-F:variable} 可用于执行内部(基于文件名)子请求,以确定variable 的最终值。大多数情况下,这与上面的 LA-U 相同。

CondPattern 是条件模式,它是一个正则表达式,应用于TestString 的当前实例。TestString 首先被评估,然后与CondPattern 匹配。

CondPattern 通常是与 Perl 兼容的正则表达式,但还有其他语法可用于对Teststring 执行其他有用的测试。

  1. 您可以使用 '!' 字符(感叹号)作为模式字符串的前缀来否定条件的结果,无论使用哪种CondPattern
  2. 您可以执行词法字符串比较
    <CondPattern
    词法上优先
    CondPattern 视为普通字符串,并将其与TestString 进行词法比较。如果TestString 在词法上优先于CondPattern,则为真。
    >CondPattern
    词法上后于
    CondPattern 视为普通字符串,并将其与TestString 进行词法比较。如果TestString 在词法上后于CondPattern,则为真。
    =CondPattern
    词法上相等
    CondPattern 视为普通字符串,并将其与TestString 进行词法比较。如果TestString 在词法上等于CondPattern(两个字符串完全相同,字符与字符相同),则为真。如果CondPattern""(两个引号),则将TestString 与空字符串进行比较。
    <=CondPattern
    词法上小于或等于
    CondPattern 视为普通字符串,并将其与TestString 进行词法比较。如果TestString 在词法上优先于CondPattern 或等于CondPattern(两个字符串相同,字符与字符相同),则为真。
    >=CondPattern
    词法上大于或等于
    CondPattern 视为普通字符串,并将其与TestString 进行词法比较。如果TestString 在词法上后于CondPattern 或等于CondPattern(两个字符串相同,字符与字符相同),则为真。

    注意

    字符串比较运算符是CondPattern 参数的一部分,如果使用引号,则必须将其包含在引号中。例如
    RewriteCond %{HTTP_USER_AGENT} "=This Robot/1.0"
  3. 您可以执行整数比较
    -eq
    在数值上等于
    TestString 被视为整数,并与CondPattern 进行数值比较。如果两者在数值上相等,则为真。
    -ge
    在数值上大于等于
    TestString 被视为整数,并与CondPattern 进行数值比较。如果TestString 在数值上大于或等于CondPattern,则为真。
    -gt
    在数值上大于
    TestString 被视为整数,并与CondPattern 进行数值比较。如果TestString 在数值上大于CondPattern,则为真。
    -le
    在数值上小于等于
    TestString 被视为整数,并与CondPattern 进行数值比较。如果TestString 在数值上小于或等于CondPattern,则为真。为了避免与-l 混淆,请使用-L-h 变体。
    -lt
    在数值上小于
    TestString 被视为整数,并与CondPattern 进行数值比较。如果TestString 在数值上小于CondPattern,则为真。为了避免与-l 混淆,请使用-L-h 变体。
    -ne
    在数值上不等于
    TestString 被视为整数,并与CondPattern 进行数值比较。如果两者在数值上不同,则为真。这等效于 !-eq
  4. 您可以执行各种文件属性测试
    -d
    目录
    TestString 视为路径名,并测试它是否存在以及是否为目录。
    -f
    是普通文件
    TestString 视为路径名,并测试它是否存在以及是否为普通文件。
    -F
    是现有文件,通过子请求。
    检查TestString 是否为有效文件,可通过服务器当前为该路径配置的所有访问控制进行访问。这使用内部子请求来进行检查,因此请谨慎使用 - 它会影响服务器的性能!
    -h
    是符号链接,bash 约定。
    参见-l
    -l
    是符号链接
    TestString 视为路径名,并测试它是否存在以及是否为符号链接。如果存在混淆的可能性,例如使用-lt-le 测试时,也可能使用 bash 约定-L-h
    -L
    是符号链接,bash 约定。
    参见-l
    -s
    是普通文件,具有大小
    TestString 视为路径名,并测试它是否存在以及是否为大小大于零的普通文件。
    -U

    是现有 URL,通过子请求。
    检查TestString 是否为有效 URL,可通过服务器当前为该路径配置的所有访问控制进行访问。这使用内部子请求来进行检查,因此请谨慎使用 - 它会影响服务器的性能!

    此标志返回有关访问控制、身份验证和授权等方面的信息。此标志不会返回有关配置的处理程序(静态文件、CGI、代理等)将返回的状态代码的信息。

    -x
    具有可执行权限。
    TestString 视为路径名,并测试它是否存在以及是否具有可执行权限。这些权限根据底层操作系统确定。
    例如
    RewriteCond /var/www/%{REQUEST_URI} !-f
    RewriteRule ^(.+) /other/archive/$1 [R]
  5. 如果TestString 具有特殊值 expr,则CondPattern 将被视为 ap_expr

    在以下示例中,-strmatch 用于将 REFERER 与站点主机名进行比较,以阻止不需要的热链接。

    RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
    RewriteRule "^/images" "-" [F]

您还可以通过将[flags] 作为 RewriteCond 指令的第三个参数附加到CondPattern 来设置特殊标志,其中flags 是以下任何标志的逗号分隔列表

示例

要根据请求的 ``User-Agent:'' 标头重写站点的首页,您可以使用以下内容

RewriteCond  "%{HTTP_USER_AGENT}"  "(iPhone|Blackberry|Android)"
RewriteRule  "^/$"                 "/homepage.mobile.html"  [L]

RewriteRule  "^/$"                 "/homepage.std.html"     [L]

解释:如果您使用识别自己为移动浏览器的浏览器(请注意,此示例不完整,因为还有许多其他移动平台),则将提供首页的移动版本。否则,将提供标准页面。

默认情况下,多个 RewriteCond 按顺序进行评估,并隐式使用逻辑AND。如果条件失败,在没有OR 标志的情况下,整个规则集将被放弃,并且不会评估进一步的条件。

top

RewriteEngine 指令

描述启用或禁用运行时重写引擎
语法RewriteEngine on|off
默认RewriteEngine off
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态扩展
模块mod_rewrite

RewriteEngine 指令启用或禁用运行时重写引擎。如果将其设置为 off,则此模块根本不会进行任何运行时处理。它甚至不会更新 SCRIPT_URx 环境变量。

使用此指令在特定上下文中禁用规则,而不是注释掉所有 RewriteRule 指令。

请注意,重写配置不会由虚拟主机继承。这意味着您需要为要使用重写规则的每个虚拟主机设置 RewriteEngine on 指令。

如果 RewriteMap 指令的类型为 prg,并且它们定义在没有将 RewriteEngine 设置为 on 的上下文中,则它们不会在服务器初始化期间启动。

top

RewriteMap 指令

描述定义用于键查找的映射函数
语法RewriteMap MapName MapType:MapSource [MapTypeOptions]
上下文服务器配置,虚拟主机
状态扩展
模块mod_rewrite
兼容性第三个参数 MapTypeOptions 仅在 Apache 2.4.29 及更高版本中可用

RewriteMap 指令定义一个重写映射,该映射可通过映射函数在重写规则的替换字符串中使用,以通过键查找插入/替换字段。此查找的来源可以是多种类型。

MapName 是映射的名称,将用于通过以下结构之一为重写规则的替换字符串指定映射函数

${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }

当出现这样的结构时,会查询映射表MapName并查找键LookupKey。如果找到该键,则用SubstValue替换映射函数结构。如果未找到该键,则用DefaultValue替换,如果没有指定DefaultValue,则用空字符串替换。空值的行为与不存在的键相同,因此无法区分空值键和不存在的键。

例如,您可以定义一个RewriteMap如下

RewriteMap examplemap "txt:/path/to/file/map.txt"

然后,您可以在RewriteRule中使用此映射,如下所示

RewriteRule "^/ex/(.*)" "${examplemap:$1}"

MapTypeOptions参数的含义取决于特定的MapType。有关更多信息,请参阅使用 RewriteMap

可以使用以下MapTypeMapSource组合

txt
一个包含以空格分隔的键值对的纯文本文件,每行一个。(详情 ...)
rnd
从纯文本文件中随机选择一个条目。(详情 ...)
dbm
在包含名称-值对的 dbm 文件中查找条目。使用httxt2dbm实用程序从纯文本文件格式构建哈希。(详情 ...)
int
RewriteMap提供的四个可用内部函数之一:toupper、tolower、escape 或 unescape。(详情 ...)
prg
调用外部程序或脚本来处理重写。(详情 ...)
dbd 或 fastdbd
要执行的 SQL SELECT 语句,用于查找重写目标。(详情 ...)

更多详细信息和大量示例,请参阅RewriteMap 如何使用

top

RewriteOptions 指令

描述为重写引擎设置一些特殊选项
语法RewriteOptions Options
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态扩展
模块mod_rewrite

RewriteOptions指令为当前每个服务器或每个目录配置设置一些特殊选项。Option字符串目前只能是以下之一

Inherit

这将强制当前配置继承父配置。在每个虚拟服务器上下文中,这意味着继承主服务器的映射、条件和规则。在每个目录上下文中,这意味着继承父目录的.htaccess配置或<Directory>部分的条件和规则。继承的规则实际上被复制到使用此指令的部分。如果与本地规则结合使用,则继承的规则将被复制到本地规则后面。此指令的位置(在本地规则下方或上方)不会影响此行为。如果本地规则强制重写停止,则不会处理继承的规则。

从父范围继承的规则在之后应用于子范围内指定的规则。
InheritBefore

与上面的Inherit类似,但父范围的规则在之前应用于子范围内指定的规则。
在 Apache HTTP Server 2.3.10 及更高版本中可用。

InheritDown

如果启用此选项,所有子配置将继承当前配置的配置。它等效于在所有子配置中指定RewriteOptions Inherit。有关如何处理父子关系的更多详细信息,请参阅Inherit选项。
在 Apache HTTP Server 2.4.8 及更高版本中可用。

InheritDownBefore

与上面的InheritDown类似,但当前范围的规则在之前应用于任何子范围中指定的规则。
在 Apache HTTP Server 2.4.8 及更高版本中可用。

IgnoreInherit

此选项强制当前配置和子配置忽略所有从指定InheritDownInheritDownBefore的父级继承的规则。
在 Apache HTTP Server 2.4.8 及更高版本中可用。

AllowNoSlash

默认情况下,mod_rewrite将忽略映射到磁盘上的目录但缺少尾部斜杠的 URL,以预期mod_dir模块将向客户端发出重定向到带有尾部斜杠的规范 URL。

DirectorySlash指令设置为关闭时,可以启用AllowNoSlash选项以确保不再忽略重写规则。如果需要,此选项可以使在没有尾部斜杠的情况下匹配目录的 .htaccess 文件中应用重写规则成为可能。
在 Apache HTTP Server 2.4.0 及更高版本中可用。

AllowAnyURI

当在VirtualHost或服务器上下文中使用 httpd 2.2.22 或更高版本中的RewriteRule时,mod_rewrite将仅在请求 URI 是URL-path时处理重写规则。这避免了一些安全问题,其中某些规则可能允许“意外”模式扩展(请参阅CVE-2011-3368CVE-2011-4317)。要解除对匹配 URL-path 的限制,可以启用AllowAnyURI选项,mod_rewrite将对任何请求 URI 字符串应用规则集,无论该字符串是否匹配 HTTP 规范要求的 URL-path 语法。
在 Apache HTTP Server 2.4.3 及更高版本中可用。

安全警告

如果与未仔细编写的重写规则一起使用,启用此选项将使服务器容易受到安全问题的攻击。强烈建议不要使用此选项。特别是,注意包含“@”字符的输入字符串,这些字符串可能会根据上述 CVE 名称更改转换后的 URI 的解释。

MergeBase

使用此选项,RewriteBase的值将从其显式定义的位置复制到任何未定义其自身RewriteBase的子目录或子位置。这是 2.4.0 到 2.4.3 中的默认行为,并且恢复它的标志在 Apache HTTP Server 2.4.4 及更高版本中可用。

IgnoreContextInfo

在目录(htaccess)上下文中进行相对替换并且未设置RewriteBase时,此模块使用一些扩展的 URL 和文件系统上下文信息将相对替换更改回 URL。mod_userdirmod_alias等模块提供此扩展的上下文信息。在 2.4.16 及更高版本中可用。

LegacyPrefixDocRoot

在 2.4.26 之前,如果替换是与当前虚拟主机匹配的绝对 URL,则 URL 可能会先缩减为 URL-path,然后缩减为本地路径。由于 URL 可以缩减为本地路径,因此路径应以文档根目录为前缀。这可以防止在对 http://host/file/myfile 发出请求时访问 /tmp/myfile,其中包含以下RewriteRule

RewriteRule /file/(.*) http://localhost/tmp/$1

此选项允许使用旧行为,其中文档根目录不会作为前缀添加到从 URL 缩减的本地路径。在 2.4.26 及更高版本中可用。

top

RewriteRule 指令

描述定义重写引擎的规则
语法RewriteRule Pattern Substitution [flags]
上下文服务器配置、虚拟主机、目录、.htaccess
覆盖FileInfo
状态扩展
模块mod_rewrite

RewriteRule指令是真正的重写引擎主力。该指令可以出现多次,每个实例定义一个重写规则。定义这些规则的顺序很重要 - 这是它们在运行时应用的顺序。

Pattern是一个与 perl 兼容的正则表达式。根据RewriteRule指令定义的位置,此模式将与什么进行比较会有所不同。

匹配什么?

  • VirtualHost上下文中,Pattern将最初与 URL 中主机名和端口之后以及查询字符串之前的部分(例如,“/app1/index.html”)进行匹配。这是(%-解码的)URL-path

  • 在每个目录上下文中(Directory和 .htaccess),Pattern仅与部分路径进行匹配,例如,请求“/app1/index.html”可能会导致与“app1/index.html”或“index.html”进行比较,具体取决于RewriteRule定义的位置。

    在比较之前,将从当前映射的文件系统路径中剥离定义规则的目录路径(包括尾部斜杠)。此每个目录前缀剥离的最终结果是,此上下文中的规则仅与当前映射的文件系统路径中“低于”定义规则的部分进行匹配。

    DocumentRootAlias等指令,甚至先前RewriteRule替换的结果,都会确定当前映射的文件系统路径。

  • 如果您希望与主机名、端口或查询字符串进行匹配,请分别使用带有%{HTTP_HOST}%{SERVER_PORT}%{QUERY_STRING}变量的RewriteCond

每个目录重写

  • 重写引擎可以在.htaccess文件和<Directory>部分中使用,但会有一些额外的复杂性。
  • 要在此上下文中启用重写引擎,您需要设置“RewriteEngine On以及必须启用“Options FollowSymLinks”。如果您的管理员已为用户的目录禁用了FollowSymLinks的覆盖,那么您将无法使用重写引擎。出于安全原因,需要此限制。
  • 有关将添加到相对替换的哪个前缀的更多信息,请参阅RewriteBase指令。
  • 如果您希望在每个目录(htaccess)RewriteRule 中与完整的 URL-path 进行匹配,请在RewriteCond中使用%{REQUEST_URI}变量。
  • 删除的前缀始终以斜杠结尾,这意味着匹配发生在从不具有前导斜杠的字符串上。因此,带有^/Pattern在每个目录上下文中永远不会匹配。
  • 虽然重写规则在语法上允许在<Location><Files>部分(包括它们的正则表达式对应部分)中使用,但这永远不应该是必要的,并且不受支持。这些上下文中可能出现故障的功能是相对替换。
  • If块遵循目录上下文的规则。
  • 默认情况下,mod_rewrite 在合并属于相同上下文的节时会覆盖规则。RewriteOptions指令可以更改此行为,例如使用Inherit设置。
  • RewriteOptions还规范了在配置的相同嵌套级别声明的节的行为。在以下示例中,默认情况下,只有第二个If块中声明的 RewriteRules 被考虑,因为第一个被覆盖了。使用RewriteOptions Inherit 强制 mod_rewrite 合并这两个节并考虑两组语句,而不是仅考虑最后一组语句。
<If "true">
  # Without RewriteOptions Inherit, this rule is overridden by the next
  # section and no redirect will happen for URIs containing 'foo'
  RewriteRule foo http://example.com/foo [R]
</If>
<If "true">
  RewriteRule bar http://example.com/bar [R]
</If>

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

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

注意

当使用否定字符来否定模式时,您不能在该模式中包含分组通配符部分。这是因为,当模式匹配(即否定匹配)时,组中没有内容。因此,如果使用否定模式,您不能在替换字符串中使用$N

重写规则的 替换 是替换由模式匹配的原始 URL 路径的字符串。替换 可以是

文件系统路径
指定要传递给客户端的资源在文件系统上的位置。仅当在服务器(虚拟主机)上下文中配置规则并且替换中路径的第一个组件存在于文件系统中时,替换才被视为文件系统路径
URL 路径
一个 DocumentRoot 相对路径,指向要提供的资源。请注意,mod_rewrite 会尝试通过检查路径的第一段是否在文件系统的根目录中存在来猜测您是否指定了文件系统路径或 URL 路径。例如,如果您指定了一个/www/file.html替换字符串,那么它将被视为 URL 路径,除非您的文件系统根目录(或在使用 .htaccess 文件中的重写时,相对于您的文档根目录)存在名为www 的目录,在这种情况下,它将被视为文件系统路径。如果您希望其他 URL 映射指令(如 Alias)应用于生成的 URL 路径,请使用[PT] 标志,如下所述。
绝对 URL

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

请注意,使用绝对 URI 的重定向(隐式或非隐式)将包括请求的查询字符串,要防止这种情况,请参阅下面的[QSD] 标志。

-(破折号)
破折号表示不应执行任何替换(现有路径将原样传递)。这在需要应用标志(见下文)而无需更改路径时使用。

除了纯文本之外,替换字符串还可以包含

  1. 对 RewriteRule 模式的反向引用($N
  2. 对最后匹配的 RewriteCond 模式的反向引用(%N
  3. 服务器变量,如规则条件测试字符串(%{VARNAME}
  4. 映射函数 调用(${mapname:key|default}

反向引用是形式为$NN=0..9)的标识符,它将被匹配的模式的第N个组的内容替换。服务器变量与 RewriteCond 指令的测试字符串相同。映射函数来自 RewriteMap 指令,并在其中解释。这三种类型的变量按上述顺序展开。

重写规则应用于先前重写规则的结果,按照它们在配置文件中定义的顺序。URL 路径或文件系统路径(见上文“匹配了什么?”)将被替换完全替换,重写过程将继续,直到所有规则都已应用,或者被 L 标志 显式终止,或者其他暗示立即终止的标志,例如ENDF

修改查询字符串

默认情况下,查询字符串将原样传递。但是,您可以在替换字符串中创建包含查询字符串部分的 URL。只需在替换字符串中使用问号来指示以下文本应重新注入查询字符串。当您要擦除现有查询字符串时,只需在替换字符串末尾使用问号。要组合新的和旧的查询字符串,请使用[QSA] 标志。

此外,您可以通过将[标志] 作为 RewriteRule 指令的第三个参数附加来设置要执行的特殊 操作标志 是一个逗号分隔的列表,用方括号括起来,包含以下表格中的任何标志。有关每个标志的更多详细信息和示例,请参阅 重写标志文档

标志和语法 功能
B 在应用转换之前,对反向引用中的非字母数字字符进行转义。有关服务器变量的类似转义,请参阅“转义” 映射函数详情 ...
BCTLS 与 [B] 相似,但只转义控制字符和空格。详情 ...
BNE [B] 或 [BCTLS] 中不应转义的字符。详情 ...
backrefnoplus|BNP 如果反向引用正在转义,空格应转义为 %20 而不是 +。当反向引用将用于路径组件而不是查询字符串时很有用。详情 ...
chain|C 规则链接到以下规则。如果规则失败,则链接到它的规则将被跳过。详情 ...
cookie|CO=NAME:VAL 在客户端浏览器中设置 cookie。完整语法为:CO=NAME:VAL:domain[:lifetime[:path[:secure[:httponly[samesite]]]]] 详情 ...
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 被发送到指定的内容处理程序进行处理。详情 ...
last|L 立即停止重写过程,不再应用任何规则。尤其要注意每个目录和 .htaccess 上下文的注意事项(另请参阅 END 标志)。详情 ...
next|N 重新运行重写过程,从第一个规则重新开始,使用迄今为止规则集的结果作为起点。详情 ...
nocase|NC 使模式比较不区分大小写。详情 ...
noescape|NE 防止 mod_rewrite 对导致重定向的重写结果中的特殊字符应用十六进制编码转义。 详情 ...
nosubreq|NS 如果当前请求是内部子请求,则导致规则被跳过。详情 ...
proxy|P 强制将替换 URL 作为代理请求内部发送。详情 ...
passthrough|PT 强制将生成的 URI 传递回 URL 映射引擎,以处理其他 URI 到文件名转换器,例如AliasRedirect详情 ...
qsappend|QSA 将原始请求 URL 中的任何查询字符串附加到重写目标中创建的任何查询字符串。详情 ...
qsdiscard|QSD 丢弃附加到传入 URI 的任何查询字符串。详情 ...
qslast|QSL 将最后一个(最右边)问号解释为查询字符串分隔符,而不是像通常使用的那样解释第一个(最左边)问号。在 2.4.19 及更高版本中可用。详情 ...
redirect|R[=code] 强制执行外部重定向,可选地使用指定的 HTTP 状态代码。详情 ...
skip|S=num 告诉重写引擎,如果当前规则匹配,则跳过接下来的num个规则。详情 ...
type|T=MIME-type 强制目标文件的 MIME 类型 为指定的类型。详情 ...
UnsafeAllow3F 允许来自可能不安全的 URL 的替换。详情 ...
UnsafePrefixStat 允许来自前导变量或反向引用到文件系统路径的潜在不安全的替换。详情 ...

主目录扩展

当替换字符串以类似于“/~user”的字符串开头(通过显式文本或反向引用)时,mod_rewrite 会执行主目录扩展,而与 mod_userdir 的存在或配置无关。

当在 RewriteRule 指令上使用PT 标志时,不会发生此扩展。

以下是所有可能的替换组合及其含义

在每个服务器配置(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/.htaccess,使用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 通过内部代理

可用语言:  en  |  fr 

top

评论

注意
这不是问答区。此处发布的评论应针对改进文档或服务器的建议,如果这些建议已被实施或被认为无效/偏离主题,则可能被我们的版主删除。有关如何管理 Apache HTTP Server 的问题,请咨询我们的 IRC 频道 #httpd(位于 Libera.chat)或发送至我们的 邮件列表