【问题标题】:Match all subdomains except one in mod_rewrite匹配除 mod_rewrite 中的一个之外的所有子域
【发布时间】:2009-08-19 19:04:42
【问题描述】:

好的,所以我正在执行 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]

这行得通。据我所知,它工作得很好。问题是,我无法相信这是实现这场比赛的最佳方式。前瞻后瞻?真的吗?实现等价表达式的“正确”方式是什么?

【问题讨论】:

    标签: regex apache mod-rewrite


    【解决方案1】:

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

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

    否则任何以dog 开头的内容都不允许使用。

    这同样适用于消极的lookbehind:

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

    使用^ 将其锚定到字符串的开头将确保仍然允许以dog 结尾的内容,例如catdog

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 没关系,但我的问题比这更复杂,因为我有多个子域的其他条件。
      • 好吧,在你的问题中解释一下。人们通常不会读心,你知道吗?
      • 顺便说一句,您可以在一条规则 RewriteCond %{HTTP_HOST} !(^dog\.|^cat\.) 中对所有条件进行单一否定。但是,话又说回来,如果不了解您的复杂情况,很难判断这是否会有所帮助
      猜你喜欢
      • 2022-11-22
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多