当前位置: 首页 > 知识库问答 >
问题:

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

谭毅然
2024-10-30

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

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

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

共有3个答案

百里景山
2024-10-30

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

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

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

李捷
2024-10-30

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

慕云
2024-10-30

回答

问题的根源在于你的 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 指令。然而,对于简单的重定向场景,上面的示例可能足够。

 类似资料:
  • LNGX环境中添加了2个主机,反向代理的是自己docker部署的应用,目前可以正常访问,这两个访问的地址是a.test.com和b.test.com LNMP环境中添加了2个主机,一个是wordpress程序,访问的是c.test.com,可以正常访问,另外一个是纯静态的html应用,访问的是test.com,不带子域名的,访问的时候内容是LNGX环境中最新部署的b.test.com的内容。 求解

  • 本文向大家介绍详解nginx 301跳转到带www域名方法,包括了详解nginx 301跳转到带www域名方法的使用技巧和注意事项,需要的朋友参考一下 前提:在域名解析中添加 domain.com 和 www.domain.com 指向你的主机IP地址 方法1. 打开 nginx.conf 文件找到你的server配置段: 方法2. 在配置文件里面写两个server,domain.com指向www

  • AMH版本:7.1 amssl:3.8 nginx:1.24 开启强制https后访问80端口不会强制跳转到443。 例如访问http://amh.sh不会自动跳转到https://amh.sh

  • 我的firebase数据库有以下规则: 因此,我不能登录到我的应用程序,即使我使用有效的电子邮件id和密码。当我把我的规则改成下面的规则时,事情就完全正常了。

  • 我在Route53中为我的www子域设置了一个别名,但是如果我去www.example.net,它会转发到endpoint地址:http://example.net.s3-website-us-east-1.amazonaws.com/ 但如果我转到根域示例。net,它显示了一个例子。net而不是endpoint地址(这是我想要发生的)。 为什么要 www.example.net 将我转发到终结点

  • 使用指南 - 数据报告 - 访问分析 - 受访域名的定义和规则 受访域名报告为您提供访客对网站各个域名的访问情况。系统自动将网站二级域名下的url聚合在一起。 一级域名是在com、net、org等前加一级,如baidu.com;二级域名就是在一级域名前再加一级,如tongji.baidu.com,www.baidu.com。 点开二级域名前的“加号”,您可以看到该二级域名下一系列子目录的访问情况,

  • 想让用户访问test.com的时候强制跳转到www.test.com上 下面这样写不行 请问应该怎么改?

  • 干净Debian11系统,做完update和upgrade后安装面板,命令如下: export CV=[CN] DV=amrewrite,amssl,madmin,amfile,amftp,pure-ftpd,amdata,amnetwork,amcrontab,d-ram,d-os,d-cpu,d-disk,d-net,d-io,d-avg && wget https://dl.amh.sh/a