高级Apache Rewrite:需要防止第2个目录深度匹配第1个目录深度的字符串

时间:2012-01-10 17:18:47

标签: apache mod-rewrite

我需要防止第二个目录深度或更深层次的字符串匹配第一个目录深度规则与多域支持引发额外的混乱。除了这个问题,一切都很好。我需要先做一些澄清。

有问题的页面是我在dir2或更深处的URL中有字符串'blog'(没有引号)但我只希望它匹配dir1。

目录深度的视觉......

本地主机/ example.com / DIR1 / DIR2 / DIR3 /

我有多域支持,基本上多个网站共享相同的模块(模块是博客/,论坛/,消息/等)。每个站点的目录与模块位于同一目录中(/ dir1 / website1 /与dir1 / blog /位于同一目录中)。基本上你要么访问一个被重写的set模块(blog /,forums /,messages /),要么模块不匹配,它会被重写到主索引文件。

发生了什么......

管理员/模板/博客

...正在匹配......

博客/

我尝试过使用^ starts with operator但问题是由于多域支持,我必须横向开始两个目录。

这是我目前的代码......

RewriteEngine on
RewriteRule .*/admin(.+) admin$1 [QSA]
RewriteRule .*/blog(.+) blog$1 [QSA]
RewriteCond %{REQUEST_URI} !.*(admin/|blog/)
RewriteRule !\.(css|js)$ index.php

我可以删除倒数第二行的博客/条件,但博客模块最终会重写为index.php。我在过去的几个小时里做了一些调整但没有取得任何成功,不幸的是,据我所知,多域支持在线是一个不存在的问题。

我知道这是一个棘手的设置,我会尽力澄清任何人的问题。

1 个答案:

答案 0 :(得分:1)

据我了解,您应该尝试匹配多域字符串,而不是在RewriteRules开头时过于通用的.*匹配。

所以让我们试试这样的事情:

RewriteRule ^[^/]*/admin(.+) admin$1 [QSA]
RewriteRule ^[^/]*/blog(.+) blog$1 [QSA]

其中[^/]表示不是“/”的任何内容,^[^/]*/foo表示以多次斜杠开头,直到您达到斜杠,然后foo < / em>的。因此,这应该是一种有效的方法,可以将'foo'检测为仅作为第一级目录名称,因为域名中不允许使用“/”。