这个 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
中的$1
和RewriteRule
具有相同值的原因。我的困惑来自RewriteCond
有一个单独的捕获组((index\.php|...
)。但如果它被使用的话,那将变成RewriteRule
中的%1
。请参阅***.com/a/32383175/1499877 了解更多信息。【参考方案2】:
$1 表示来自正则表达式中第一组括号的匹配项。 ($2 将匹配第二组括号 - 如果给定)
例如,正则表达式匹配任何不是“index.php”或“phpinfo.php”等的内容。因此,如果请求的 url 不是其中之一,并且匹配的部分是然后传递给重写器。
【讨论】:
$1
表示 RewriteRule 正则表达式中第一组括号的匹配,而不是 RewriteCond 正则表达式中的匹配。以上是关于这个 RewriteCond 中的 $1 参数有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章