【问题标题】: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 的第一个参数。

【问题讨论】:

    标签: apache codeigniter mod-rewrite


    【解决方案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。请参阅stackoverflow.com/a/32383175/1499877 了解更多信息。
    【解决方案2】:

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

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

    【讨论】:

    • $1 表示 RewriteRule 正则表达式中第一组括号的匹配,而不是 RewriteCond 正则表达式中的匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2017-07-25
    • 2011-04-24
    相关资源
    最近更新 更多