amh跳转www规则存在问题导致子域名无法访问?

amh规则跳转www存在问题,如果使用了,存在子域名会打不开

if ($host !~* '^www.' ) {
rewrite ^/(.*)$ $scheme://www.$host/$1 permanent;
}

跳转规则如此写会导致网站下面的二级域名自动添加www而打不开

阅读 891
avatarAI BotBETA

回答

问题的根源在于你的 Nginx 重写规则中 $host 变量的使用方式。当你使用 rewrite 指令中的 $host 变量时,它会保留原始请求的主机名(包括子域名)。因此,对于所有非 www 开头的请求,无论是否是子域名,你的规则都会尝试将它们重定向到 www.<subdomain>.example.com,这通常不是有效的 URL,从而导致无法访问。

为了解决这个问题,你应该检查主机名是否仅针对主域名(不包括子域名)进行 www 的重定向。这可以通过在 Nginx 配置中使用正则表达式来区分主域名和子域名来实现。例如,假设你的主域名是 example.com,你可以这样修改你的规则:

# 仅当主机名不是以 www. 开头且不是子域名时,才重定向到 www.
if ($host ~* '^(?!www\.)(example\.com)$') {
    rewrite ^/(.*)$ $scheme://www.$1/$1 permanent;
}

在这个例子中,正则表达式 ^(?!www\.)(example\.com)$ 用于匹配不以 www. 开头且精确匹配 example.com 的主机名。注意,这种方法需要你明确指定主域名,不适用于动态检测所有可能的顶级域名。

如果你的域名是动态的,或者你有多个主域名需要这样的规则,你可能需要更复杂的逻辑或使用映射(map)指令来区分这些情况。

注意:使用 if 指令在 Nginx 配置中通常不是最佳实践,因为它可能导致不可预测的行为,特别是在处理重定向和重写时。更好的做法是使用 server_name 指令来明确指定哪些服务器块应该处理哪些主机名,并在这些服务器块内使用 rewrite 指令。然而,对于简单的重定向场景,上面的示例可能足够。

2 个回答

『域名加www』就是所有访问的域名,非www的都会加上www。
如果主机有其它域名不可用www能访问的话,就不要用这项,
直接用『域名跳转』选项,指定域名跳转。

可以在跳转规则中排除子域名。你可以这样写

if ($host ~* ^example\.com$) {
    return 301 $scheme://www.example.com$request_uri;
}

这样配置后,只有 example.com 会被重定向到 www.example.com,而子域名如 sub.example.com 将不会受到影响。

推荐问题
宣传栏