这个 RewriteCond 中的 $1 参数有啥作用?

Posted

技术标签:

【中文标题】这个 RewriteCond 中的 $1 参数有啥作用?【英文标题】:What does the $1 argument in this RewriteCond do?这个 RewriteCond 中的 $1 参数有什么作用? 【发布时间】:2012-11-02 09:16:01 【问题描述】:

我正在设置 Apache 重写规则来整理我的 CodeIgniter URL。

This question(以及我在该地方发现的许多论坛帖子等)记录了以下规则(或非常相似的规则)的使用:

RewriteEngine on
RewriteCond $1 !^(index\.php|phpinfo\.php|images|robots\.txt|sitemap\.xml\.gz|sitemap\.xml|assets)
RewriteRule ^(.*)$ /index.php/$1 [L]

我知道 RewriteRule 后面的 $1 指的是从 (.*) 中捕获的字符串,但是 第一个 $1(直接在 RewriteCond 之后)代表什么? 我见过很多例子使用 %REQUEST_URI 作为 RewriteCond 的第一个参数。

【问题讨论】:

【参考方案1】:

$1 基本上是从字符串的开头和结尾捕获的所有内容。换句话说,$1 = (.*)

在您的重写中,^ 表示字符串的开头,(.*) 表示匹配任何内容,$ 表示字符串的结尾。所以,基本上,它是说从字符串的开头到结尾抓取所有内容并将该值分配给 $1。

所以如果我输入www.example.com/tacos-are-good,然后输入$1 = "tacos-are-good"。所以你最终的重写实际上是www.example.com/index.php/tacos-are-good

这是 ModRewrite 的备忘单,可能会有所帮助: http://www.addedbytes.com/cheat-sheets/mod_rewrite-cheat-sheet/

【讨论】:

那么 $1 的两个实例引用相同的值? 是的。在RewriteCond 中,基本上是说只要 $1 不等于条件右侧列出的文件中的一个,它就会运行重写。 问题是针对 RewriteCond $1,现在针对 RewriteRule 澄清一下,RewriteRule 中的$1 变成了使用来自RewriteRule 的正则表达式^(.*)$ 捕获的任何内容。那么RewriteCond 中的$1 是同一捕获组的backreference,这就是RewriteCond 中的$1RewriteRule 具有相同值的原因。我的困惑来自RewriteCond 有一个单独的捕获组((index\.php|...)。但如果它被使用的话,那将变成RewriteRule 中的%1。请参阅***.com/a/32383175/1499877 了解更多信息。【参考方案2】:

$1 表示来自正则表达式中第一组括号的匹配项。 ($2 将匹配第二组括号 - 如果给定)

例如,正则表达式匹配任何不是“index.php”或“phpinfo.php”等的内容。因此,如果请求的 url 不是其中之一,并且匹配的部分是然后传递给重写器。

【讨论】:

$1 表示 RewriteRule 正则表达式中第一组括号的匹配,而不是 RewriteCond 正则表达式中的匹配。

以上是关于这个 RewriteCond 中的 $1 参数有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

Apache中RewriteCond规则参数的详细介绍

带有参数的 url 的 RewriteCond

Apache中 RewriteCond 规则参数介绍

这个 GCC 内联汇编中的参数列表有啥问题?

RewriteCond 以任何顺序匹配查询字符串参数

.htaccess rewritecond/rule 并隐藏 url 参数