【问题标题】:Matching all subdomains except some from list in htaccess匹配除 htaccess 列表中的一些子域之外的所有子域
【发布时间】:2022-11-22 04:40:01
【问题描述】:

如何处理 example.com 的所有子域(例如 123.example.comabc.example.com 等),此列表中的子域除外:

  • main1
  • main2
  • main3

如果子域匹配,.htaccess 中的这条规则将有助于将 robots.txt 更改为 robots_sub.txt。这是一个例子:

RewriteCond %{HTTP_HOST} ^(?<!main1|main2|main3).+\.example\.com$ [NC]
RewriteRule ^robots\.txt$ /robots_sub.txt [L]

结果应该是:

123.example.com - match
abc.example.com - match
main1.example.com - exclusion
zyx.example.com - match
main2.example.com - exclusion
main3.example.com - exclusion
sub.example.com - match

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案1】:
    RewriteCond %{HTTP_HOST} ^(?<!main1|main2|main3).+.example.com$ [NC]
    

    用一个消极的展望, 而不是消极的向后看 *这里。例如:

    RewriteCond %{HTTP_HOST} ^(?!(main1|main2|main3).)[^.]+.example.com$ [NC]
    :
    

    仅排除完全等于 main1main2main3 的子域。允许使用部分匹配的子域(例如 abcmain1main1xyz)。

    或者,使用单独的(健康)状况.例如:

    RewriteCond %{HTTP_HOST} !^(main1|main2|main3).
    RewriteCond %{HTTP_HOST} .example.com$ [NC]
    :
    

    ! 前缀条件模式在第一(健康)状况否定表达式,以便在不匹配时成功(即当Host 标头不以main1.main2.main3. 开头时)。第二(健康)状况然后确认它是一个被请求的子域而不是域顶点。


    补充说明:

    RewriteCond %{HTTP_HOST} ^(?<!main1|main2|main3).+.example.com$ [NC]
    

    *在尝试使用负面回顾通过这种方式,您试图断言字符串main1(或main2main3)不存在字符串的开头(即。Host 标头),这在这种情况下是不可能的,所以总是会成功的。为了使用负向后视,您需要首先匹配指定字符串之前可能出现的内容。例如:

    ^.+(?<!^(main1|main2|main3)).mywebsite.com$
    

    但这效率较低否定前瞻上面用过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多