我有一个 mod_rewrite 行,可以在 Apache 2.2 下工作,但不能在 Apache 1.3 下工作:
RewriteRule ^(?!index.php)(?!skin/)(?!js/)(.+) /index.php?file=$1 [NC,L]
如果我丢失了括号之间的负前瞻组件,我将丢失 500 状态代码。GoDaddy 不会为这个客户端的包升级 httpd(叹气),那么有没有人有一个可以在 1.3 中工作的解决方案(并且不是太混乱:P)?或者更好的是任何人都可以解释这里可能发生的事情吗?我之所以保持好奇,只是因为我找不到关于 1.3 中使用的不支持负前瞻的 Perl 正则表达式引擎的任何信息……
Apache 1.3 不使用 Perl 兼容的正则表达式 (PCRE),它使用 POSIX 正则表达式。POSIX 正则表达式不支持负前瞻。PCRE 支持是从 Apache 2 开始的一项新功能。
至于如何让它工作,你可能需要使用一些 RewriteCond 来让规则在它与这三个之一匹配时不触发......例如:
当然,我还没有测试过……我没有任何 Apache 1.3 了。
亚当贝莱尔是对的。Apache 用 1.2 版和 2.0 版更改了正则表达式引擎。
对于 Apache 1.1.x,他们使用“ System V8 ”,从 Apache 1.2 及更高版本开始使用POSIX ERE。最后一次更改是在 Apache 2.0 切换到PCRE时。您可以查看正则表达式风味比较以了解差异。
现在这是一个解决方案,您可以如何在没有仅在 PCRE 中可用的前瞻断言的情况下解决此问题:
这里的附加
RewriteCond
是检查第一个子模式的匹配字符串是否以列出的选项开头。