![](/img/trans.png)
[英]How to redirect all URLs except one path and all its subpaths without 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]
它锚定到带有字符串的开始^
将确保东西,只是结尾dog
像catdog
还是被允许。
类似于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.