Apr*_*che 3 regex apache mod-rewrite
好吧,所以我正在做一个mod_rewrite,而我正处于需要匹配除了一个子域之外的任何子域的情况.它开始看起来像这样.
RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]
Run Code Online (Sandbox Code Playgroud)
这样匹配并捕获单个子域,没有句点.但是,让我说我不想匹配名为'dog'的子域.我尝试用这样的负面预测做到这一点.
RewriteCond %{HTTP_HOST} ^((?!dog)[^\.]+)\.example\.com$ [NC]
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都有效.dog.example.com不再匹配,这很好.但是,doggies.example.com也不再匹配.这是不好的.
我能够通过使用负向前瞻和负面后视这样来解决这个问题.
RewriteCond %{HTTP_HOST} ^((?!dog)[^\.]+(?<!dog))\.example\.com$ [NC]
Run Code Online (Sandbox Code Playgroud)
这有效.据我所知,它完美无缺.问题是,我无法相信这是实现这场比赛的最佳方式.前瞻和后视?真?实现等效表达的"正确"方法是什么?
如果要使用负向前瞻,则需要将表达式锚定到点:
RewriteCond %{HTTP_HOST} ^((?!dog\.)[^.]+)\.example\.com$ [NC]
Run Code Online (Sandbox Code Playgroud)
否则,dog不允许任何开头的事情.
这同样适用于负面观察:
RewriteCond %{HTTP_HOST} ^([^\.]+(?<!^dog))\.example\.com$ [NC]
Run Code Online (Sandbox Code Playgroud)
将它锚定到字符串的开头^将确保仍然允许以dog类似结尾的内容catdog.
类似于Vinko Vrsalovic提到的另一个解决方案是测试第一个子匹配的内容:
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC]
RewriteCond %1 !^dog$
Run Code Online (Sandbox Code Playgroud)