【问题标题】:Matching all subdomains except some from list in htaccess匹配除 htaccess 列表中的一些子域之外的所有子域
【发布时间】:2022-11-22 04:40:01
【问题描述】:
如何处理 example.com 的所有子域(例如 123.example.com、abc.example.com 等),此列表中的子域除外:
如果子域匹配,.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]
:
仅排除完全等于 main1 或 main2 或 main3 的子域。允许使用部分匹配的子域(例如 abcmain1 或 main1xyz)。
或者,使用单独的(健康)状况.例如:
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(或main2或main3)不存在前字符串的开头(即。前Host 标头),这在这种情况下是不可能的,所以总是会成功的。为了使用负向后视,您需要首先匹配指定字符串之前可能出现的内容。例如:
^.+(?<!^(main1|main2|main3)).mywebsite.com$
但这效率较低否定前瞻上面用过。