在mod_rewrite中匹配除一个子域名之外的所有子域名

3

好的,我正在进行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个回答

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
你可以使用 RewriteCond 的否定运算符来简化很多东西,像这样:
RewriteCond %{HTTP_HOST} ^([^\.]+)\.mydomain\.com$ [NC]
RewriteCond %{HTTP_HOST} !^dog\. [NC]

没问题,但我的问题比那个更复杂,因为我有其他条件适用于多个子域。 - Apreche
好的,请在你的问题中解释清楚。你知道,人们通常不会读心术。 - Vinko Vrsalovic
顺便说一下,您可以在单个规则的RewriteCond %{HTTP_HOST}中为所有条件使用单个否定符号!(^dog.|^cat.)。但是,再次强调,如果不了解您的复杂情况,很难确定这是否有所帮助。 - Vinko Vrsalovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接