Apache HTTP Server 版本 2.4
描述 | 提供基于规则的重写引擎,用于动态重写请求的 URL |
---|---|
状态 | 扩展 |
模块标识符 | rewrite_module |
源文件 | mod_rewrite.c |
模块使用基于规则的重写引擎,基于 PCRE 正则表达式解析器,动态重写请求的 URL。默认情况下,mod_rewrite
将 URL 映射到文件系统路径。但是,它也可以用于将一个 URL 重定向到另一个 URL,或调用内部代理获取。mod_rewrite
提供了一种灵活且强大的方法,可以使用无限数量的规则来操作 URL。每个规则可以有无限数量的附加规则条件,允许您根据服务器变量、环境变量、HTTP 标头或时间戳重写 URL。mod_rewrite
对完整的 URL 路径进行操作,包括路径信息部分。重写规则可以在 mod_rewrite
httpd.conf
或 .htaccess
中调用。重写规则生成的路径可以包含查询字符串,也可以导致内部子处理、外部请求重定向或内部代理吞吐量。
更多详细信息、讨论和示例,请参阅 详细的 mod_rewrite 文档。
在 mod_rewrite
trace1
到 trace8
日志级别提供其操作的详细日志记录。可以使用
指令为 LogLevel
特定设置日志级别:最高级别 mod_rewrite
debug
不会记录任何操作,而 trace8
表示实际上所有操作都会被记录。
mod_rewrite
使用高跟踪日志级别会极大地降低 Apache HTTP Server 的速度!仅在调试时使用高于 trace2
的日志级别!LogLevel alert rewrite:trace3
熟悉早期版本的
的人无疑会寻找 mod_rewrite
RewriteLog
和 RewriteLogLevel
指令。此功能已完全被上面提到的新的每个模块日志记录配置所取代。
要仅获取
特定的日志消息,请将日志文件通过 grep 传递mod_rewrite
tail -f error_log|fgrep '[rewrite:'
描述 | 设置每个目录重写的基本 URL |
---|---|
语法 | RewriteBase URL-path |
默认 | 无 |
上下文 | 目录,.htaccess |
覆盖 | FileInfo |
状态 | 扩展 |
模块 | mod_rewrite |
指令指定用于每个目录(htaccess)RewriteBase
指令的基本 URL,这些指令替换相对路径。RewriteRule
当您在每个目录(htaccess)上下文中使用替换中的相对路径时,此指令是必需的,除非以下任一条件为真
DocumentRoot
下(而不是通过其他方式访问,例如 Alias
)。RewriteRule
的目录的文件系统路径,后缀为相对替换,在服务器上也作为 URL 路径有效(这很少见)。Alias
或 mod_userdir
映射时,可以省略此指令。在下面的示例中,
是必需的,以避免重写到 http://example.com/opt/myapp-1.2.3/welcome.html,因为资源不是相对于文档根目录的。此错误配置通常会导致服务器在文档根目录下查找“opt”目录。RewriteBase
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 TestString CondPattern [flags] |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 扩展 |
模块 | mod_rewrite |
指令定义规则条件。一个或多个 RewriteCond
可以位于 RewriteCond
指令之前。只有当 URI 的当前状态与其模式匹配,并且满足这些条件时,才会使用以下规则。RewriteRule
TestString 是一个字符串,除了纯文本之外,它还可以包含以下扩展结构
$N
(0 <= N <= 9) 形式的反向引用。$1 到 $9 提供对来自 RewriteRule
的模式的已分组部分(在括号中)的访问,该 RewriteRule
受当前 RewriteCond
条件集的约束。$0 提供对该模式匹配的整个字符串的访问。%N
(0 <= N <= 9) 形式的反向引用。%1 到 %9 提供对来自当前条件集中最后匹配的 RewriteCond
的模式的已分组部分(同样,在括号中)的访问。%0 提供对该模式匹配的整个字符串的访问。${mapname:key|default}
形式的扩展。有关更多详细信息,请参阅 RewriteMap 的文档。%{
NAME_OF_VARIABLE }
形式的变量,其中 NAME_OF_VARIABLE 可以是以下列表中的字符串HTTP 标头 | 连接和请求 | |
---|---|---|
HTTP_ACCEPT HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_REFERER HTTP_USER_AGENT |
AUTH_TYPE CONN_REMOTE_ADDR CONTEXT_PREFIX CONTEXT_DOCUMENT_ROOT IPV6 PATH_INFO QUERY_STRING REMOTE_ADDR REMOTE_HOST REMOTE_IDENT REMOTE_PORT REMOTE_USER REQUEST_METHOD SCRIPT_FILENAME |
|
服务器内部 | 日期和时间 | 特殊 |
DOCUMENT_ROOT SCRIPT_GROUP SCRIPT_USER SERVER_ADDR SERVER_ADMIN SERVER_NAME SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE |
TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME |
API_VERSION CONN_REMOTE_ADDR HTTPS IS_SUBREQ REMOTE_ADDR REQUEST_FILENAME REQUEST_SCHEME REQUEST_URI THE_REQUEST |
这些变量都对应于同名的 HTTP MIME 标头、Apache HTTP Server 的 C 变量或 Unix 系统的 struct tm
字段。大多数在 此处 或手册的其他地方或 CGI 规范中都有记录。
SERVER_NAME 和 SERVER_PORT 分别取决于
和 UseCanonicalName
的值。UseCanonicalPhysicalPort
那些对
特殊的包括以下内容。mod_rewrite
API_VERSION
CONN_REMOTE_ADDR
mod_remoteip
模块)。HTTPS
mod_ssl
,此变量都可以安全使用)。IS_SUBREQ
REMOTE_ADDR
mod_remoteip
模块)。REQUEST_FILENAME
REQUEST_FILENAME
时服务器已确定此路径。否则,例如在虚拟主机上下文中,与 REQUEST_URI
相同的值。根据 AcceptPathInfo
的值,服务器可能只使用 REQUEST_URI
的一些前导组件来将请求映射到文件。REQUEST_SCHEME
ServerName
影响。REQUEST_URI
QUERY_STRING
的独立变量提供。返回的 REQUEST_URI
值已进行 %-解码,要对其进行重新编码,请将其通过“escape” 映射函数 传递。THE_REQUEST
GET /index.html HTTP/1.1
”)。这并不包括浏览器发送的任何其他标头。此值未进行转义(解码),与下面大多数其他变量不同。如果 TestString 的特殊值为 expr
,则 CondPattern 将被视为 ap_expr。如果未给出 novary
标志,则表达式中引用的 HTTP 标头将被添加到 Vary 标头中。
您应该注意的其他事项
变量 SCRIPT_FILENAME 和 REQUEST_FILENAME 包含相同的值 - Apache HTTP Server 的内部 request_rec
结构的 filename
字段的值。第一个名称是众所周知的 CGI 变量名称,而第二个名称是 REQUEST_URI 的适当对应项(它包含 request_rec
的 uri
字段的值)。
如果发生了替换并且重写继续,则这两个变量的值将相应更新。
如果在每个服务器上下文中使用(即,在请求映射到文件系统之前),SCRIPT_FILENAME 和 REQUEST_FILENAME 无法包含完整的本地文件系统路径,因为在此处理阶段路径未知。在这种情况下,这两个变量最初将包含 REQUEST_URI 的值。为了在每个服务器上下文中获取请求的完整本地文件系统路径,请使用基于 URL 的前瞻 %{LA-U:REQUEST_FILENAME}
来确定 REQUEST_FILENAME 的最终值。
%{ENV:variable}
,其中 variable 可以是任何环境变量,也可用。这是通过 Apache httpd 的内部结构查找的(如果在那里找不到),则通过 Apache httpd 服务器进程的 getenv()
查找。%{SSL:variable}
,其中variable 是 SSL 环境变量 的名称,无论是否加载 mod_ssl
都可以使用,但如果未加载,则始终扩展为空字符串。例如:%{SSL:SSL_CIPHER_USEKEYSIZE}
可能扩展为 128
。即使没有设置 SSLOptions
指令的 StdEnvVars
选项,这些变量也可用。%{HTTP:header}
,其中header 可以是任何 HTTP MIME 标头名称,始终可用于获取 HTTP 请求中发送的标头的值。例如:%{HTTP:Proxy-Connection}
是 HTTP 标头 ``Proxy-Connection:
'' 的值。如果在条件中使用 HTTP 标头,则如果条件对请求求值为真,则此标头将添加到响应的 Vary 标头中。如果条件对请求求值为假,则不会添加它。将 HTTP 标头添加到响应的 Vary 标头中对于正确缓存是必需的。
必须记住,在 'ornext|OR
' 标志的情况下,条件遵循短路逻辑,因此某些条件可能根本不会被评估。
%{LA-U:variable}
可用于前瞻,前瞻执行内部(基于 URL 的)子请求以确定variable 的最终值。这可用于访问在当前阶段不可用但在稍后阶段将设置的重写变量。例如,要根据服务器上下文(httpd.conf
文件)中的 REMOTE_USER
变量进行重写,必须使用 %{LA-U:REMOTE_USER}
- 此变量由授权阶段设置,该阶段在 URL 转换阶段(mod_rewrite
在此阶段运行)之后进行。
另一方面,由于 mod_rewrite
通过 API 的 Fixup 阶段实现其每个目录上下文(.htaccess
文件),并且授权阶段在此阶段之前进行,因此您只需在该上下文中使用 %{REMOTE_USER}
即可。
%{LA-F:variable}
可用于执行内部(基于文件名)子请求,以确定variable 的最终值。大多数情况下,这与上面的 LA-U 相同。CondPattern 是条件模式,它是一个正则表达式,应用于TestString 的当前实例。TestString 首先被评估,然后与CondPattern 匹配。
CondPattern 通常是与 Perl 兼容的正则表达式,但还有其他语法可用于对Teststring 执行其他有用的测试。
!
' 字符(感叹号)作为模式字符串的前缀来否定条件的结果,无论使用哪种CondPattern。""
(两个引号),则将TestString 与空字符串进行比较。RewriteCond %{HTTP_USER_AGENT} "=This Robot/1.0"
!-eq
。是现有 URL,通过子请求。
检查TestString 是否为有效 URL,可通过服务器当前为该路径配置的所有访问控制进行访问。这使用内部子请求来进行检查,因此请谨慎使用 - 它会影响服务器的性能!
此标志仅返回有关访问控制、身份验证和授权等方面的信息。此标志不会返回有关配置的处理程序(静态文件、CGI、代理等)将返回的状态代码的信息。
RewriteCond /var/www/%{REQUEST_URI} !-f RewriteRule ^(.+) /other/archive/$1 [R]
如果TestString 具有特殊值 expr
,则CondPattern 将被视为 ap_expr。
在以下示例中,-strmatch
用于将 REFERER
与站点主机名进行比较,以阻止不需要的热链接。
RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'" RewriteRule "^/images" "-" [F]
您还可以通过将[
flags]
作为 RewriteCond
指令的第三个参数附加到CondPattern 来设置特殊标志,其中flags 是以下任何标志的逗号分隔列表
nocase|NC
'(不区分大小写)ornext|OR
'(或下一个条件)RewriteCond "%{REMOTE_HOST}" "^host1" [OR] RewriteCond "%{REMOTE_HOST}" "^host2" [OR] RewriteCond "%{REMOTE_HOST}" "^host3" RewriteRule ...some special stuff for any of these hosts...如果没有此标志,您将不得不将条件/规则对编写三次。
novary|NV
'(不变异)示例
要根据请求的 ``User-Agent:
'' 标头重写站点的首页,您可以使用以下内容
RewriteCond "%{HTTP_USER_AGENT}" "(iPhone|Blackberry|Android)" RewriteRule "^/$" "/homepage.mobile.html" [L] RewriteRule "^/$" "/homepage.std.html" [L]
解释:如果您使用识别自己为移动浏览器的浏览器(请注意,此示例不完整,因为还有许多其他移动平台),则将提供首页的移动版本。否则,将提供标准页面。
默认情况下,多个 RewriteCond
按顺序进行评估,并隐式使用逻辑AND。如果条件失败,在没有OR
标志的情况下,整个规则集将被放弃,并且不会评估进一步的条件。
描述 | 启用或禁用运行时重写引擎 |
---|---|
语法 | RewriteEngine on|off |
默认 | RewriteEngine off |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 扩展 |
模块 | mod_rewrite |
RewriteEngine
指令启用或禁用运行时重写引擎。如果将其设置为 off
,则此模块根本不会进行任何运行时处理。它甚至不会更新 SCRIPT_URx
环境变量。
使用此指令在特定上下文中禁用规则,而不是注释掉所有 RewriteRule
指令。
请注意,重写配置不会由虚拟主机继承。这意味着您需要为要使用重写规则的每个虚拟主机设置 RewriteEngine on
指令。
如果 RewriteMap
指令的类型为 prg
,并且它们定义在没有将 RewriteEngine
设置为 on
的上下文中,则它们不会在服务器初始化期间启动。
描述 | 定义用于键查找的映射函数 |
---|---|
语法 | 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。
可以使用以下MapType和MapSource组合
httxt2dbm
实用程序从纯文本文件格式构建哈希。(详情 ...)RewriteMap
提供的四个可用内部函数之一:toupper、tolower、escape 或 unescape。(详情 ...)更多详细信息和大量示例,请参阅RewriteMap 如何使用
描述 | 为重写引擎设置一些特殊选项 |
---|---|
语法 | 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
此选项强制当前配置和子配置忽略所有从指定InheritDown
或InheritDownBefore
的父级继承的规则。
在 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-3368和CVE-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_userdir
和mod_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 及更高版本中可用。
描述 | 定义重写引擎的规则 |
---|---|
语法 | 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
定义的位置。
在比较之前,将从当前映射的文件系统路径中剥离定义规则的目录路径(包括尾部斜杠)。此每个目录前缀剥离的最终结果是,此上下文中的规则仅与当前映射的文件系统路径中“低于”定义规则的部分进行匹配。
DocumentRoot
和Alias
等指令,甚至先前RewriteRule
替换的结果,都会确定当前映射的文件系统路径。
如果您希望与主机名、端口或查询字符串进行匹配,请分别使用带有%{HTTP_HOST}
、%{SERVER_PORT}
或%{QUERY_STRING}
变量的RewriteCond
。
<Directory>
部分中使用,但会有一些额外的复杂性。RewriteEngine On
”以及必须启用“Options FollowSymLinks
”。如果您的管理员已为用户的目录禁用了FollowSymLinks
的覆盖,那么您将无法使用重写引擎。出于安全原因,需要此限制。RewriteBase
指令。RewriteCond
中使用%{REQUEST_URI}
变量。^/
的Pattern在每个目录上下文中永远不会匹配。<Location>
和<Files>
部分(包括它们的正则表达式对应部分)中使用,但这永远不应该是必要的,并且不受支持。这些上下文中可能出现故障的功能是相对替换。If
块遵循目录上下文的规则。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 路径的字符串。替换 可以是
DocumentRoot
相对路径,指向要提供的资源。请注意,mod_rewrite
会尝试通过检查路径的第一段是否在文件系统的根目录中存在来猜测您是否指定了文件系统路径或 URL 路径。例如,如果您指定了一个/www/file.html
的替换字符串,那么它将被视为 URL 路径,除非您的文件系统根目录(或在使用 .htaccess 文件中的重写时,相对于您的文档根目录)存在名为www
的目录,在这种情况下,它将被视为文件系统路径。如果您希望其他 URL 映射指令(如 Alias
)应用于生成的 URL 路径,请使用[PT]
标志,如下所述。如果指定了绝对 URL,mod_rewrite
会检查主机名是否与当前主机匹配。如果匹配,则会剥离方案和主机名,并将生成的路径视为 URL 路径。否则,将对给定 URL 执行外部重定向。要强制将外部重定向回当前主机,请参阅下面的[R]
标志。
请注意,使用绝对 URI 的重定向(隐式或非隐式)将包括请求的查询字符串,要防止这种情况,请参阅下面的[QSD]
标志。
-
(破折号)除了纯文本之外,替换字符串还可以包含
$N
)%N
)%{VARNAME}
)${mapname:key|default}
)反向引用是形式为$
N(N=0..9)的标识符,它将被匹配的模式的第N个组的内容替换。服务器变量与 RewriteCond
指令的测试字符串相同。映射函数来自 RewriteMap
指令,并在其中解释。这三种类型的变量按上述顺序展开。
重写规则应用于先前重写规则的结果,按照它们在配置文件中定义的顺序。URL 路径或文件系统路径(见上文“匹配了什么?”)将被替换完全替换,重写过程将继续,直到所有规则都已应用,或者被 L
标志 显式终止,或者其他暗示立即终止的标志,例如END
或F
。
默认情况下,查询字符串将原样传递。但是,您可以在替换字符串中创建包含查询字符串部分的 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 到文件名转换器,例如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 类型 为指定的类型。详情 ... |
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 通过内部代理 |