我有一个mod_rewrite行在Apache 2.2下工作,但不在Apache 1.3下:
RewriteRule ^(?!index.php)(?!skin/)(?!js/)(.+) /index.php?file=$1 [NC,L]
如果我丢失了方括号之间的负向预测组件,我将失去500个状态码。 GoDaddy不会升级这个客户端软件包(叹气)的httpd,所以有人得到了一个解决scheme,可以在1.3的工作(并不太麻烦:P)? 或者甚至更好,任何人都可以解释这里可能会发生什么? 我仍然很好奇,因为我找不到在1.3中使用的Perl正则expression式引擎不支持负面预测的任何信息…
Apache 1.3不使用Perl兼容的正则expression式(PCRE),它使用POSIX正则expression式。 POSIX正则expression式不支持负向预测。 PCRE支持是从Apache 2开始的一项新function 。
至于如何使这个工作,你可能需要使用一些RewriteCond规则不触发,如果它匹配这三个之一…例如也许:
RewriteCond %{REQUEST_URI} !index.php.* RewriteCond %{REQUEST_URI} !skin/.* RewriteCond %{REQUEST_URI} !js/.* RewriteRule ^(?!index.php)(?!skin/)(?!js/)(.+) /index.php?file=$1 [NC,L]
当然,我还没有testing过…我现在还没有任何Apache 1.3的。
Adam Bellaire是对的。 Apache使用版本1.2和版本2.0更改了正则expression式引擎。
对于Apache 1.1.x,他们使用“ System V8 ”,自Apache 1.2以后,它是POSIX ERE 。 最后的改变是在Apache 2.0切换到PCRE时进行的 。 你可以看看正则expression式风味比较看看不同之处。
现在这里有一个解决scheme,你可以解决这个问题,而不需要在PCRE中提供的预见断言:
RewriteCond $1 !^(index\.php|skin/|js/) RewriteRule ^(.+) /index.php?file=$1 [NC,L]
这里额外的RewriteCond是检查第一个子模式的匹配的string确实从列出的选项开始。