<-
Apache HTTP 服务器 2.4 > mod_rewrite参考文档

Apache模块mod_rewrite

描述:提供基于规则的重写引擎来即时重写请求的URL
状态:延期
模块标识符:rewrite_module
源文件:mod_rewrite.c

摘要

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

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

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

详细的mod_rewrite文档中提供了更多详细信息,讨论和示例 。

支持Apache!

主题

指令

错误修正清单

也可以看看

最佳

记录中

mod_rewrite在提供详细记录其行为trace1trace8日志级别。可以mod_rewrite 使用以下LogLevel指令专门设置日志级别:到level为止debug,不记录任何操作,而trace8 实际上意味着记录了所有操作。

使用较高的跟踪日志级别mod_rewrite 会大大降低Apache HTTP Server的速度!使用比trace2仅用于调试更高的日志级别!

LogLevel alert rewrite:trace3

重写日志

那些熟悉早期版本的 mod_rewrite人无疑会在寻找 RewriteLogand RewriteLogLevel 指令。上面提到的新的每模块日志记录配置已完全取代了此功能。

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

tail -f error_log|fgrep '[rewrite:'

最佳

RewriteBase 指令

描述:设置每个目录重写的基本URL
句法:RewriteBase URL-path
默认:None
内容:目录.htaccess
覆写:文件信息
状态:延期
模块:mod_rewrite

RewriteBase伪指令指定要用于RewriteRule替代相对路径的按目录(htaccess)伪指令使用的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>
最佳

RewriteCond 指令

描述:定义重写的条件
句法: RewriteCond TestString CondPattern [flags]
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:文件信息
状态:延期
模块:mod_rewrite

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

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

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

您应该注意的其他事项:

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

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

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

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

    如果在条件中使用了HTTP标头,则该标头会添加到响应的Vary标头中,以防条件对请求的评估为true。这是不是如果条件的计算结果为false,请求加入。为了适当地缓存,需要将HTTP标头添加到响应的Vary标头中。

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

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

    例如,要根据改写 REMOTE_USER从单个服务器中(内变量httpd.conf文件),你必须使用%{LA-U:REMOTE_USER}这个变量是由授权阶段,哪来设置- 以后的URL转换阶段(在此期间 mod_rewrite操作)。

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

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

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

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

  1. !无论使用哪种CondPattern,都可以在模式字符串前添加' '字符(感叹号)以否定条件结果。
  2. 您可以执行字典字符串比较:
    <CondPattern
    Lexicographically
    before将CondPattern视为纯字符串,并将其在字典上与TestString进行比较。如果TestString在字典上位于CondPattern之前, 则为true 。
    > CondPattern
    按词典顺序
    CondPattern视为纯字符串,然后按词典顺序将其与TestString进行比较。如果TestString在字典上遵循 CondPattern,则为true 。
    = CondPattern
    按字典顺序相等
    CondPattern视为纯字符串,然后按字典顺序将其与TestString进行比较。如果TestString在字典上等于 CondPattern(两个字符串完全相同,一个字符一个字符),则为true 。如果CondPattern""(两个引号),则将TestString与空字符串进行比较。
    <= CondPattern
    字典顺序小于或等于
    对待CondPattern作为纯字符串,按字母顺序比较它的TestString。如果TestString在字典上在CondPattern之前 或等于CondPattern (两个字符串相等,一个字符一个字符),则为True 。
    > = CondPattern
    字典顺序大于或等于
    对待CondPattern作为纯字符串,按字母顺序比较它的TestString。如果TestString在字典上遵循 CondPattern或等于CondPattern (两个字符串相等,一个字符一个字符),则为true 。

    注意

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

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

    该标志返回有关访问控制,身份验证和授权之类的信息。该标志 返回有关配置的处理程序(静态文件,CGI,代理等)将返回的状态代码的信息。

    -X
    具有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]

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

例:

要根据请求的`` User-Agent:''标题重写站点的主页,可以使用以下命令:

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

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

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

最佳

RewriteEngine 指令

描述:启用或禁用运行时重写引擎
句法:RewriteEngine on|off
默认:RewriteEngine off
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:文件信息
状态:延期
模块:mod_rewrite

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

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

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

RewriteMap如果类型的指令是在prgRewriteEngine设置为 的上下文中定义的,则不会在服务器初始化期间启动on

最佳

RewriteMap 指令

描述:定义用于键查找的映射功能
句法:RewriteMap MapName MapType:MapSource [MapTypeOptions]
内容:服务器配置,虚拟主机
状态:延期
模块:mod_rewrite
兼容性:第三个参数MapTypeOptions仅在Apache 2.4.29和更高版本中可用

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

MAPNAME是地图的名称,将被用于通过以下构建体中的一个来指定一个重写规则的替换字符串的映射功能:

${ MapName : LookupKey }
${ MapName : LookupKey | 默认值 }

当发生这种构造时,将查询映射MapName并查找键LookupKey。如果找到了键,则将map-function构造替换为 SubstValue。如果未找到该密钥然后它被取代的默认值或由空字符串,如果没有默认值被指定。空值的行为就像缺少键一样,因此无法区分空值键和不存在键。

例如,您可以将定义 RewriteMap为:

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

然后,您将可以按以下方式使用此地图 RewriteRule

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

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

可以使用MapTypeMapSource的以下组合:

文本文件
一个纯文本文件,包含用空格分隔的键/值对,每行一对。(详细...
rnd
从纯文本文件中随机选择一个条目(详细信息...
数据库
在dbm文件中查找包含名称,值对的条目。哈希是使用该httxt2dbm 实用工具从纯文本文件格式构建的。(详细...
整型
提供的四个可用内部功能之一 RewriteMap:toupper,tolower,escape或unscape。(详细...
prg
调用外部程序或脚本以处理重写。(详细...
dbd或fastdbd
要执行的SQL SELECT语句以查找重写目标。(详细...

可以在RewriteMap HowTo中找到更多详细信息和大量示例。

最佳

RewriteOptions 指令

描述:为重写引擎设置一些特殊选项
句法:RewriteOptions Options
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:文件信息
状态:延期
模块:mod_rewrite

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

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

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

AllowNoSlash

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

DirectorySlash伪指令设置为off时,AllowNoSlash可以启用该选项以确保不再忽略重写规则。如果需要,可以使用此选项在与目录匹配的.htaccess文件中应用重写规则,而不用斜杠。
在Apache HTTP Server 2.4.0和更高版本中可用。

AllowAnyURI

RewriteRuleVirtualHosthttpd 2.2.22或更高版本的服务器上下文中使用时,mod_rewrite 仅当请求URI是URL-path时才处理重写规则。这避免了某些安全问题,在这些问题中特定规则可能允许“令人惊讶的”模式扩展(请参阅CVE-2011-3368CVE-2011-4317)。为了解除对与URL路径匹配的限制,AllowAnyURI可以启用该 选项,并将 mod_rewrite规则集应用于任何请求URI字符串,而不管该字符串是否与HTTP规范要求的URL路径语法匹配。
在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路径,然后再将其简化为本地路径。由于可以将URL简化为本地路径,因此该路径应以文档根作为前缀。当使用以下命令向http:// host / file / myfile发出请求时,这可以防止访问/ tmp / myfile之类的文件 RewriteRule

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

此选项允许使用旧的行为,即文档根目录不以从URL简化的本地路径作为前缀。在2.4.26及更高版本中可用。

最佳

RewriteRule 指令

描述:定义重写引擎的规则
句法:RewriteRule Pattern Substitution [flags]
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:文件信息
状态:延期
模块:mod_rewrite

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

模式是与Perl兼容的正则表达式。与该模式进行比较的方式取决于RewriteRule指令的定义位置。

匹配什么?

  • VirtualHost上下文中,模式将首先与主机名和端口之后,查询字符串(例如“ /app1/index.html”)之前的URL部分匹配。这是(%解码)URL路径

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

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

    诸如DocumentRoot和的指令Alias,甚至是先前RewriteRule替换的结果,都确定当前映射的文件系统路径。

  • 如果你想对阵的主机名,端口或查询字符串,使用 RewriteCond%{HTTP_HOST}%{SERVER_PORT}%{QUERY_STRING}分别变量。

每目录重写

  • 重写引擎可能会在.htaccess文件和<Directory>部分中使用,但会带来一些额外的复杂性。
  • 要在这种情况下启用重写引擎,需要设置“ RewriteEngine On”,并且Options FollowSymLinks必须启用 “ ”。如果您的管理员已禁用FollowSymLinks对用户目录的覆盖,则您将无法使用重写引擎。出于安全原因,此限制是必需的。
  • 有关将RewriteBase 哪些前缀添加回相对替换的更多信息,请参见指令。
  • 如果您希望与每个目录(htaccess)RewriteRule中的完整URL路径匹配,请在中使用%{REQUEST_URI}变量RewriteCond
  • 删除的前缀始终以斜杠结尾,这意味着匹配是针对从未有前导斜杠的字符串进行的 。因此,在每个目录上下文中,从不匹配的模式^/
  • 尽管语法在<Location><Files>部分中(包括对应的正则表达式)在语法上允许使用重写规则,但这永远是不必要的,不受支持。在这些情况下可能打破的特征是相对替换。
  • 这些If块遵循目录上下文的规则。
  • 默认情况下, 合并属于同一上下文的时,mod_rewrite会覆盖规则。该RewriteOptions指令可以更改此行为,例如使用“ 继承”设置。
  • RewriteOptions还规定,在配置相同嵌套级别的陈述部分的行为。在下面的示例中,默认情况下,仅If考虑第二个块中声明的RewriteRules ,因为第一个被重写。使用RewriteOptions继承会强制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,NOT字符(' !')也可用作可能的模式前缀。这使您可以否定模式。例如:`` 如果当前URL 与该模式匹配 ''。这可以用于例外情况,在这种情况下更容易匹配否定模式,或者用作最后的默认规则。

注意

使用NOT字符取反模式时,不能在该模式中包括分组的通配符部分。这是因为,如果模式不匹配(即,否定匹配),则组中没有内容。因此,如果使用取反的模式,则不能$N在替换字符串中使用!

替换重写规则的是,取代了由匹配原始URL路径字符串模式。该换人可能是:

文件系统路径
指定要传递给客户端的资源在文件系统上的位置。仅当在服务器(虚拟主机)上下文中配置了规则并且替换中路径的第一部分存在于文件系统中时,替换才被视为文件系统路径
网址路径
DocumentRoot要服务于资源-relative路径。请注意,mod_rewrite 通过检查路径的第一段是否存在于文件系统的根目录中来尝试猜测是指定了文件系统路径还是URL路径。例如,如果您将Substitution字符串指定为 /www/file.html,那么它将被视为URL路径,除非www 在根目录或文件系统中存在一个名为目录的目录(或者,如果在.htaccess文件中使用重写,则相对于您的文档根目录),在这种情况下,它将被视为文件系统路径。如果您希望使用其他URL映射指令(例如Alias)应用于要生成的URL路径,请使用[PT]如下所述的标志。
绝对网址
如果指定了绝对URL,请 mod_rewrite检查主机名是否与当前主机匹配。如果是这样,则将方案和主机名删除,并将得到的路径视为URL路径。否则,将对给定URL执行外部重定向。要强制外部重定向回到当前主机,请参见[R]下面的标志。
- (短跑)
破折号表示不应执行任何替换(现有路径未经修改地传递)。当需要在不更改路径的情况下应用标志(请参阅下文)时,将使用此方法。

除纯文本外,替换字符串还可以包括

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

反向引用是形式为$NN = 0..9)的标识符,该标识符 将由匹配Pattern的第N组内容替换。服务器变量是相同的的TestString一个的 指令。映射功能来自该 指令,并在此处进行了说明。这三种类型的变量按上述顺序扩展。RewriteCondRewriteMap

重写规则按照在配置文件中定义的顺序应用于以前的重写规则的结果。URL路径或文件系统路径(请参见上面的“与之匹配的内容?”,上面的内容)已完全Substitution替换,重写过程将继续进行,直到应用了所有规则,或者由Lflag或其他标志显式终止了 表示立即终止,例如 ENDF

修改查询字符串

默认情况下,查询字符串不变。但是,您可以在包含查询字符串部分的替换字符串中创建URL。只需在替换字符串中使用问号来表示应将以下文本重新插入到查询字符串中。当您要删除现有的查询字符串时,只需用问号结束替换字符串。要组合新旧查询字符串,请使用该 [QSA]标志。

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

标志和语法 功能
应用转换之前,请在反向引用中转义非字母数字字符。细节 ...
backrefnoplus | BNP 如果要对反向引用进行转义,则应将空格转义为%20而不是+。在路径组件而不是查询字符串中使用反向引用时很有用。细节 ...
链| C 规则链接到以下规则。如果规则失败,则链接到该规则的规则将被跳过。细节 ...
cookie | CO = NAMEVAL 在客户端浏览器中设置cookie。完整语法为:CO = 名称VAL [:生存期 [:路径 [:安全 [:httponly ]]]]] 详细信息...
丢弃路径| DPI 导致重写的URI的PATH_INFO部分被丢弃。细节 ...
结束 立即停止重写过程,不要再应用任何规则。还可以防止在每个目录和.htaccess上下文中进一步执行重写规则。(在2.3.9及更高版本中可用) 详细信息...
env | E = [!] VAR [:VAL ] 导致设置环境变量VAR(如果提供,则设置为VAL值)。表格 !VAR导致未设置环境变量VAR细节 ...
禁止| F 向客户端浏览器返回403 FORBIDDEN响应。 细节 ...
走了| G 向客户端浏览器返回410 GONE响应。细节 ...
处理程序| H = 内容处理程序 导致将结果URI发送到指定的 Content-handler进行处理。细节 ...
最后| L 立即停止重写过程,不要再应用任何规则。特别要注意每个目录和.htaccess上下文的注意事项(另请参阅END标志)。细节 ...
下一个| N 以规则集的结果为起点,从第一条规则开始重新运行重写过程。细节 ...
nocase | NC 使模式比较不区分大小写。 细节 ...
noescape | NE 防止mod_rewrite在重写结果中应用特殊字符的十六进制转义。细节 ...
nosubreq | NS 如果当前请求是内部子请求,则导致规则被跳过。细节 ...
代理| P 强制将替代URL作为代理请求在内部发送。细节 ...
直通| PT 强制将结果URI传递回URL映射引擎,以处理其他URI到文件名的翻译器,例如AliasRedirect细节 ...
qsappend | QSA 将来自原始请求URL的任何查询字符串追加到在重写目标中创建的任何查询字符串。细节 ...
qsdiscard | QSD 丢弃所有附加到传入URI的查询字符串。 细节 ...
qslast | QSL 将最后一个(最右边)问号解释为查询字符串定界符,而不是通常使用的第一个(最左边)问号。在2.4.19及更高版本中可用。 细节 ...
redirect | R [= 代码 ] 强制进行外部重定向,可以选择使用指定的HTTP状态代码。细节 ...
跳过| S = num 如果当前规则匹配,则告诉重写引擎跳过下一个num规则。细节 ...
type | T = MIME类型 强制目标文件的MIME类型为指定的类型。细节 ...

主目录扩展

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

在 指令上使用PT标志时,不会发生这种扩展RewriteRule

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

内部服务器(httpd.conf
中的请求`` GET /somepath/pathinfo'':

Copyright 2020 The Apache Software Foundation.
基于 Apache License, Version 2.0 许可证.

给定规则 结果替代
^ / 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] 没有意义,不受支持