我正在尝试更好地理解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'的结果。 为什么会这样? ?!
和?:
语法是什么?我不理解使用?
时没有任何前缀。干杯
答案 0 :(得分:4)
(?= ...)
和(?! ...)
是Perl正则表达式和PCRE中的特殊语法,它是Apache使用的正则表达式库。它们分别是正面和负面的前瞻断言:如果后面的文本匹配或与括号中的内容不匹配,它们匹配空字符串。
它们是非捕获的,所以它们没有定义任何$n
(它们没有意义,因为它们匹配一个空字符串)。 (?: ...)
也是非捕获的,它用于对子表达式进行分组。
您的第一条规则应该在.htaccess
中运行(但不能在虚拟主机配置文件中使用),尽管将其编写为
RewriteRule ^(?!index\.php$)(.*)$ index.php?path=$1 [L]
也许另一条规则是与它互动。您可以使用RewriteLog
和RewriteLogLevel
检查确切匹配和重写的内容。
答案 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