2010-10-26 74 views
2

我正在写一个mod_rewrite规则,并希望一只手使它做我想做的事。正则表达式来匹配任何不以某个字符串开头的东西

基本上我想有下列情形的工作:

request | Redirect to 
--------------------- 
cheese | /?page=cheese 
abc123 | /?page=abc123 
abc/def | /?page=abc/def 
a/b/c/d | /?page=a/b/c/d 

(任何字母数字加 - /和_重定向)

有两个特殊情况:

request | Redirect to 
------------------------ 
admin | don't redirect 
media | don't redirect 

有了这两个我不希望任何子目录等重定向。

我得尽可能:

RewriteRule ^([A-Za-z0-9-_]+)/$ /index.php?page=$1 [L] 

但这仅满足前两个测试。

任何想法?

回答

2

我会先创建一个单独的规则(如Kobi也建议)并使用RewriteRule dash directive来防止替换。

的破折号表示没有取代 应当执行(现有路径 通过原封不动传递)。这是 当一个标志(见下文)需要 应用而不改变路径时使用。

^index.php - [L] 
^(admin|media) - [L] 
^([A-Za-z0-9-_/\.]+)$ /?page=$1 [L] 

(我不能现在就测试这个我在哪里,所以你可能需要稍微修改这个 - 抱歉..但这个想法应该很清楚)

测试基于Apache 2.2


编辑:之所以能够现在尝试了这一点 - 添加[L],使其工作需要。
编辑2:意识到我没有回答完整的问题,为其余的东西添加了规则。

+0

酷 - 不知道破折号!似乎访问/ admin /不会与/admin/index.php(它没有任何重写规则...) – 2010-10-27 07:29:58

+0

/admin/going在哪里?你有两个index.html和index.php位于/ admin?如果你这样做,index.html出现在索引之前。php的Apache的DirectoryIndex配置指令,这可能会导致问题。 – 2010-10-27 15:56:04

1

如果您的版本支持它,您可以在使用负前瞻:

^(?!(?:admin|media)$)([A-Za-z0-9-_]+)/$ 

现在,我没有系统管理员,但你可能可以有一个较早的规则匹配adminmedia,这是可能是一个更简单的想法

+0

看起来像你可以,取决于版本:[正则表达式负面预测不适用于不同的Apache版本之间的mod_rewrite](http://serverfault.com/q/120971/2454) – Kobi 2010-10-26 19:59:26

+0

哦,我也想在'adminACB'上失败,只需从前瞻中删除'$'标志:'(?!admin | media)' – Kobi 2010-10-26 20:06:14

+0

我喜欢这个,但我会去回答其他答案,因为我认为它更容易维护继续。非常感谢! – 2010-10-27 07:29:11

相关问题