6

考虑以下:

RewriteRule ^(.*)$ index.php/$1

根据我对 mod_rewrite 的新手知识,这应该匹配example.com/和之间的整个 URL 部分?query=string,然后在它前面加上index.php/,通常,这正是发生的情况。

http://example.com/some/stuff -> http://example.com/index.php/some/stuff

现在,考虑:

RewriteRule . index.php

根据 Concrete5 CMS 当前更新的开发人员的说法,这完全一样。事实上,它似乎也在我的服务器上做到了这一点。

我的问题是,为什么第二个 RewriteRule 会产生相同的结果而不是类似的结果

http://example.com/some/stuff -> http://example.com/index.phpome/stuff

不应该.匹配一个字符然后用index.php字符串替换吗?这是在 Apache 2.2 上。

4

2 回答 2

1

RewriteRule ^(.*)$ index.php/$1将匹配并使用捕获的文本创建一个新路径,并将最初请求的任何内容添加到$1is 的末尾。

RewriteRule . index.php匹配,因为它是一个未锚定的正则表达式。前面的正则表达式使用^and$来锚定匹配,这意味着模式必须完全匹配,而这个不匹配,这意味着它将匹配字符串中的任何位置,因此任何带有任何字符的字符串都将匹配。因为 mod_rewrite 将每个测试视为一个运行谓词,所以只要匹配,就会应用此规则。

当规则匹配时,替换发生。替换是完全替换,因此如果您不使用反向引用,$1那么原始模式中的任何内容都会丢失。在这种情况下,新路径就变成了index.php.

因此,两者之间存在细微差别,因为第二个直接进入 index.php,而没有将最初请求的路径添加到末尾。Concrete5 CMS 最有可能使用的是前端控制器,该控制器根据它直接从请求中提取的信息进行调度。由于这不是重定向重写,原始请求将被保留,以便仅使用它:将一些责任从 Apache 转移到应用程序代码手中,以减少对托管环境的依赖。

于 2012-09-30T02:23:39.620 回答
0

左边的匹配没有被替换,它只是被搜索。您必须使用反向引用来替换/保留特定部分。

于 2012-09-30T02:11:08.643 回答