mod_rewrite问题:否定

时间:2011-02-28 00:31:54

标签: regex .htaccess mod-rewrite apache

我正在尝试更好地理解mod_rewrite并且遇到一个特殊问题我认为我需要首先解决问题。

我正在使用以下

http://www.somesite.tld/a/b/c重写为index.php?path=a/b/c
RewriteRule ^(?!index.php)(.*)$ index.php?path=$1 [NC,L]

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?path=$1 [NC,L]
  • 如果没有RewriteCond,这不起作用 - path = index.php将是没有特别忽略文件或说'not index.php'的结果。 为什么会这样?
  • 此外,我有时会看到使用的?!?:语法是什么?我不理解使用?时没有任何前缀。
  • 为什么,在上面的第一个RewriteRule中,第二对括号是否返回1美元的匹配?

干杯

2 个答案:

答案 0 :(得分:4)

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

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

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

更为正确
RewriteRule ^(?!index\.php$)(.*)$ index.php?path=$1 [L]

也许另一条规则是与它互动。您可以使用RewriteLogRewriteLogLevel检查确切匹配和重写的内容。

答案 1 :(得分:-1)

“!”意味着否定。像a = 1(a等于1)a!= 1(a不等于1); “f”表示文件。所以,如果你和“!”一起使用,就像“!-f”那样“文件不存在”。以下链接可以帮助您更好:

http://www.askapache.com/htaccess/htaccess.html http://net.tutsplus.com/tutorials/other/using-htaccess-files-for-pretty-urls/ http://corz.org/serv/tricks/htaccess2.php