正则表达式匹配任何不以某个字符串开头的内容

时间:2010-10-26 19:55:34

标签: regex mod-rewrite

我正在编写一个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 个答案:

答案 0 :(得分:2)

我会创建一个单独的早期规则(正如Kobi也建议的那样)并使用RewriteRule dash directive来阻止替换。

  

破折号表示没有替代品   应该执行(现有的路径   通过未触动过)。这是   当一面旗帜(见下文)需要时使用   在不改变路径的情况下应用。

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

(我现在无法测试这个,所以你可能需要稍微编辑一下 - 对不起......但想法应该清楚了)

在Apache 2.2上测试


编辑:现在能够尝试这个 - 需要添加[L]才能使其正常工作 编辑2:已实现我没有回答完整的问题,为其他内容添加了规则。

答案 1 :(得分:1)

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

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

现在,我不是系统管理员,但你可能有一个早先的规则来匹配adminmedia,这可能是一个更容易的想法。