我已经看到众多 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引擎处理。但是,我没有在任何地方看到过这种情况。文档是否有缺陷,或者我只是完全错过了什么?
谢谢!
答案 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个字符,它无关紧要:任何非空字符串将匹配。 .*
有一个细微的区别:它会匹配任何字符串,甚至是零长度字符串。
要获得您认为的行为,请使用^
(在字符串的开头匹配)和$
(在结尾处匹配)。
要点:
.
将匹配至少包含一个字符的任何字符串
.*
将匹配任何字符串,甚至是空的
^.$
只匹配一个字符长的字符串
^.*$
将匹配单行模式中的任何字符串,或多行模式中的任何行