amh规则跳转www存在问题,如果使用了,存在子域名会打不开
if ($host !~* '^www.' ) {
rewrite ^/(.*)$ $scheme://www.$host/$1 permanent;
}
跳转规则如此写会导致网站下面的二级域名自动添加www而打不开
amh规则跳转www存在问题,如果使用了,存在子域名会打不开
if ($host !~* '^www.' ) {
rewrite ^/(.*)$ $scheme://www.$host/$1 permanent;
}
跳转规则如此写会导致网站下面的二级域名自动添加www而打不开
问题的根源在于你的 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
指令。然而,对于简单的重定向场景,上面的示例可能足够。
可以在跳转规则中排除子域名。你可以这样写
if ($host ~* ^example\.com$) {
return 301 $scheme://www.example.com$request_uri;
}
这样配置后,只有 example.com 会被重定向到 www.example.com,而子域名如 sub.example.com 将不会受到影响。
2 回答2k 阅读✓ 已解决
4 回答1.8k 阅读
2 回答1.3k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
1 回答1.5k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
『域名加www』就是所有访问的域名,非www的都会加上www。
如果主机有其它域名不可用www能访问的话,就不要用这项,
直接用『域名跳转』选项,指定域名跳转。