我的 nginx 有一点问题。我们拥有两个子域,我们称它们为domain1.com 和domain2.com。对于domain2,我们没有更多的子域,对于domain1,我们有几个。如果有人输入www.domain2.com我希望 nginx 将其转发到https://domain2.com
,否则只需将其转发到 https:// 。我通过 site-available 中的domain2配置末尾的这两个块来实现这一点:
server {
listen 80;
server_name domain2.com;
return 301 https://$http_host$request_uri;
}
server {
listen 80;
server_name www.domain2.com;
return 301 https://domain2.com$request_uri;
}
我还为所有子域启用了 HSTSadd_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
现在,当导航到www.domain2.com时,浏览器会抛出错误,因为 nginx 向它们提供了 a_subdomain.domain1.com 的证书。直接访问domain2.com时不会发生这种情况,然后nginx会提供正确的证书。不,遗憾的是,反向代理domain1的子域是不可能的,nginx在与PHP结合时似乎遇到了麻烦。
我该如何让 nginx 正确执行此操作?
有趣的是,我还有一个配置转发,从我们用来托管的域(与domain1和domain2不同)到其他服务器上的新域,这些转发没有这个问题,但新页面可能不使用HSTS ,所以这可能就是原因。
HSTS 策略会导致浏览器内部从 HTTP 重定向到 HTTPS;浏览器永远看不到 Nginx 中配置的重定向。从浏览器中的开发人员工具(“网络”选项卡):
来自 HTTPS
https://www.isdm.rwth-aachen.de/
默认块的证书的答案:server{}
为了与 HSTS 引起的这种行为相匹配,您应该将 Nginx 配置为首先重定向到 HTTPS,然后才在子域和 apex 之间重定向。所有正在使用的 HTTPS 子域都应该有一个有效的证书,这不应该成为Let's Encrypt 时代的一个障碍。
作为默认(第一)服务器,这已经涵盖了第一阶段:
您可以更改第二个
server{}
块来执行第二阶段,并拥有有效的主机名证书。这主要是评论 - 但有点长......
嗯,一开始就有点傻;您在domain2.com 上只能有一个A 记录,但在www.domain2.com上您可以有多个A 或CNAME 记录。
我以为我们正在谈论 [www.]domain[1,2].com
但您只向我们展示了您的配置片段,不包括任何通过 https 的内容,也没有您的证书的详细信息。