Apache RewriteRule:模式"。"一个特例?

时间:2011-01-16 11:23:37

标签: apache wordpress .htaccess mod-rewrite

我已经看到众多 RewriteRule示例如下:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

这里的意图是没有真实文件支持的URI将由CMS处理,并通过/index.php连接。例如,WordPress在其standard(?) .htaccess file中使用了这种技术。

但是,regexp没有任何意义。在没有讨论主题字符串匹配的讨论中(但请参阅官方Apache RewriteRule文档中的“匹配的内容?”),正则表达式.应仅匹配第一个字符!但是,它的行为与.*相同,即匹配整个主题字符串。设置RewriteLogLevel 5,我会得到..*的相同结果和日志条目。

我只能得出结论,模式.的RewriteRule是特殊的,并匹配整个字符串(la .*),而不是按原样通过RegExp引擎处理。但是,我没有在任何地方看到过这种情况。文档是否有缺陷,或者我只是完全错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

哦,呃....当我意识到自己只是跛脚时,我讨厌。

我正在接近程序员心态的mod-rewrite。在我所知道的每个regexp库中,替换仅替换主题字符串的匹配部分。例如,

$ perl
$hello = "hello";
$hello =~ s/lo/p/;
print "$hello\n";
^D

显示

help

然而,在mod-rewrite中,我们不是操纵字符串。如果URI完全匹配,我们完全将其替换为Substitution。因此,仅仅匹配(“。”)足以用整个字符串。

Apache docs这种状态,但不是那么强有力地纠正错误顶空的人:

  

重写规则的替换是   替换原始字符串的字符串   与Pattern匹配的URL路径。

答案 1 :(得分:1)

默认情况下,正则表达式在任何位置匹配输入字符串。 你假设.应该只匹配第一个字符是假的:它将匹配任何字符,第一个,最后一个,第24个字符,它无关紧要:任何非空字符串将匹配。 .*有一个细微的区别:它会匹配任何字符串,甚至是零长度字符串。

要获得您认为的行为,请使用^(在字符串的开头匹配)和$(在结尾处匹配)。

要点:

.将匹配至少包含一个字符的任何字符串 .*将匹配任何字符串,甚至是空的 ^.$只匹配一个字符长的字符串
^.*$将匹配单行模式中的任何字符串,或多行模式中的任何行