24

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

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

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 的第一个参数。

4

2 回答 2

31

$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/

于 2012-11-13T21:48:11.587 回答
9

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

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

于 2012-11-13T21:48:00.660 回答