2011-02-28 58 views
1

我想更好地理解mod_rewrite,并有一个特殊的问题,我想我需要首先让我的头部轮。mod_rewrite问题:否定

我使用以下

RewriteRule ^(?!index.php)(.*)$ index.php?path=$1 [NC,L] 

的等效重写会,在这种情况下,要重写http://www.somesite.tld/a/b/cindex.php?path=a/b/c

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

干杯

回答

4

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

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

你的第一个规则应该在.htaccess工作(而不是在一个虚拟主机配置文件),虽然这将是更正确的把它写为

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

也许是其他规则与它进行交互。你可以检查到底是什么被匹配,并用RewriteLogRewriteLogLevel重写。

+0

很高兴我问了这个问题,我不知道前瞻断言,但它们看起来非常有用。 – dianovich 2011-02-28 14:50:44

-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

+0

这并不能解释为什么上面的重写按照他们的方式工作,或者看起来像'?!'语法。 – dianovich 2011-02-28 08:07:30

+0

那么,如何写出一个否定的条件? 2或3个通用htaccess文档不是一个适应的答案 – sboye 2017-09-01 13:57:20