正则表达式负向预测在不同的 Apache 版本之间对 mod_rewrite 不起作用

正则表达式负向预测在不同的 Apache 版本之间对 mod_rewrite 不起作用

我有一个 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 正则表达式引擎不支持负向前瞻的信息……

答案1

Apache 1.3 不使用 Perl 兼容正则表达式 (PCRE),它使用 POSIX 正则表达式。POSIX 正则表达式不支持负向前查找。PCRE 支持是新功能从 Apache 2 开始。

至于如何让它工作,您可能需要使用一些 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]

当然,我还没有测试过这个...我身边不再有任何 Apache 1.3。

答案2

Adam Bellaire 是对的。Apache 在 1.2 版和 2.0 版中更改了正则表达式引擎。

对于 Apache 1.1.x,他们使用“系统 V8“从 Apache 1.2 开始POSIX 增强现实。最后一次改变是在 Apache 2.0 中,他们切换到聚合酶链反应。您可以查看正则表达式风格比较看看其中的差异。

现在这里有一个解决方案,你可以解决这个问题,而不需要仅在 PCRE 中可用的前瞻断言:

RewriteCond $1 !^(index\.php|skin/|js/)
RewriteRule ^(.+) /index.php?file=$1 [NC,L]

这里还RewriteCond需要检查第一个子模式的匹配字符串是否以列出的选项开头。

相关内容