好的,所以我正在做一个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]
这很有效。据我所知,它完美无缺。问题是,我无法相信这是实现这场比赛的最佳方式。前瞻和一个后视?真?实现等效表达的“正确”方法是什么?
答案 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]