我有一个 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
需要检查第一个子模式的匹配字符串是否以列出的选项开头。