mod_rewrite问题:否定

dia*_*ich 1 regex apache .htaccess mod-rewrite

我试图更好地理解mod_rewrite并遇到一个特殊的问题,我认为我需要先弄清楚点。

我重写http://www.somesite.tld/a/b/c,以index.php?path=a/b/c使用以下

RewriteRule ^(?!index.php)(.*)$ index.php?path=$1 [NC,L]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,等效的重写将是

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?path=$1 [NC,L]
Run Code Online (Sandbox Code Playgroud)
  • 如果RewriteCond没有明确忽略文件或不说“不是index.php”,将无法得到-path = index.php的结果。为什么是这样?
  • 另外,我有时看到的?!?:语法是什么??当它没有任何前缀时,我不理解的使用。
  • 为什么在上面的第一个RewriteRule中,第二对括号返回匹配项$ 1?

干杯

aaz*_*aaz 5

(?= ...)并且(?! ...)是在Perl的正则表达式和特殊语法PCRE,这是正则表达式库,Apache使用的。它们分别是正向和负向超前断言:如果后面的文本与方括号中的内容匹配或不匹配,则它们与空字符串匹配。

它们是非捕获的,因此它们没有定义任何内容$n(这是毫无意义的,因为它们匹配一个空字符串)。(?: ...)也是非捕获的,用于对子表达式进行分组。

您的第一个规则应该起作用.htaccess(但不能在虚拟主机配置文件中),尽管将其写为

RewriteRule ^(?!index\.php$)(.*)$ index.php?path=$1 [L]
Run Code Online (Sandbox Code Playgroud)

也许另一个规则正在与之交互。您可以检查究竟是被匹配,并改写RewriteLogRewriteLogLevel