.htaccess 匹配除htaccess中列表中的一些子域之外的所有子域

oknwwptz  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(112)

如何匹配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
siv3szwd

siv3szwd1#

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

此处使用负 * 先行*,而不是**负 * 后行*******。例如:

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

只有完全相等main1main2main3的子网域会被排除。允许有部分相符的子网域(例如abcmain1main1xyz)。
或者,使用单独的 condition。例如:

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

第一个 conditionCondPattern 上的!前缀会否定表达式,因此当表达式不匹配时(即,当Host头没有以main1.main2.main3.开头时),表达式成功。第二个 condition 则确认它是正在请求的子域,而不是域顶点。

  • 其他说明:*
RewriteCond %{HTTP_HOST} ^(?<!main1|main2|main3).+\.example\.com$ [NC]

*****在尝试以这种方式使用 negative lookbehind 时,您尝试Assert字符串main1(或main2main3)不存在 * 之前 * 的字符串开始(即,在Host报头 * 之前 *),这在该上下文中是不可能的,所以总是会成功的。为了使用否定的lookbehind,你需要首先匹配指定字符串可以在其之前的内容。例如:

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

但这比上面使用的 * 负前瞻 * 效率低。

相关问题