匹配除mod_rewrite中的一个子域以外的所有子域

时间:2009-08-19 19:04:43

标签: regex apache mod-rewrite

好的,所以我正在做一个mod_rewrite,而我正处于需要匹配除了一个子域之外的任何子域的情况。它看起来像这样。

RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]

这样匹配并捕获单个子域,没有句点。但是,让我说我不想匹配名为'dog'的子域。我尝试用这样的负面预测做到这一点。

RewriteCond %{HTTP_HOST} ^((?!dog)[^\.]+)\.example\.com$ [NC]

这在大多数情况下都有效。 dog.example.com 不再匹配,这很好。但是, doggies.example.com 也不再匹配。那不好。

我能够通过使用负面前瞻和负面的后视来解决这个问题。

RewriteCond %{HTTP_HOST} ^((?!dog)[^\.]+(?<!dog))\.example\.com$ [NC]

这很有效。据我所知,它完美无缺。问题是,我无法相信这是实现这场比赛的最佳方式。前瞻一个后视?真?实现等效表达的“正确”方法是什么?

2 个答案:

答案 0 :(得分:9)

如果要使用负前瞻,则需要将表达式锚定到点:

RewriteCond %{HTTP_HOST} ^((?!dog\.)[^.]+)\.example\.com$ [NC]

否则不允许以dog开头的任何内容。

同样适用于负面的背后隐藏:

RewriteCond %{HTTP_HOST} ^([^\.]+(?<!^dog))\.example\.com$ [NC]

使用^将其锚定到字符串的开头将确保仍然允许以dog结尾的内容,例如catdog

类似于Vinko Vrsalovic提到的另一种解决方案是测试第一个子匹配的内容:

RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC]
RewriteCond %1 !^dog$

答案 1 :(得分:1)

使用RewriteCond的否定运算符可以简化很多事情,如下所示:

RewriteCond %{HTTP_HOST} ^([^\.]+)\.mydomain\.com$ [NC]
RewriteCond %{HTTP_HOST} !^dog\. [NC]