繁体   English   中英

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

[英]Match all subdomains except one in 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]

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

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

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

否则任何以dog开头的东西都是不允许的。

这同样适用于负面观察:

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

它锚定到带有字符串的开始^将确保东西,只是结尾dogcatdog还是被允许。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM