使用https(SSL)在Nginx上运行多个域和子域

我有一个需要在SSL上运行的Nginx安装。 我的服务器块如下这个域,强制example.comwww.example.com路由到https://example.com

  server { listen 9.9.9.9:80; server_name example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name www.example.com; return 301 $scheme://example.com$request_uri; } server { ## SSL settings listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name example.com; root /home/example; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include common.conf; include ssl.conf; } 

这基本上起作用。 让我们encryption的东西正确安装。 不过,我也有一些子域名是Cloudfront的CNAME。 所以这些就像cdn.example.com 。 我怎样才能确保他们也工作,并不重新路由到https://example.com ?

在Cloudfront中,为这些CNAME启用默认的Cloudfront证书:

 SSL Certificate - Default CloudFront Certificate (*.cloudfront.net) 

这是一个问题吗?

问题是,当我访问这个网站, https://example.com cdn.example.com ,整个内容加载,但图像,CSS和JS文件(通过cdn.example.com Cloudfront cname加载)不加载。 Chrome会在这些资源的位置栏中显示一个红色的“不安全”,并显示一条大错误消息: http : //imgur.com/4sGWuIY

将我自己的CNAME CDNpath与域一起包含的正确方法是什么? 谢谢你的指点。

让我们从一些假设开始吧:

  • 你的DNS区域文件看起来像这样:

     $ORIGIN example.com IN A 9.9.9.9 www IN A 9.9.9.9 cdn IN CNAME some-subdomain-at.cloudfront.net. 

在这种情况下,您的web服务器(9.9.9.9)不应该看到任何属于cdn.example.com的请求。

为什么?

  • 当加载example.com时 ,webbrowser将从DNS系统获得IP 9.9.9.9 ,并在那里发送请求。
  • 当访问示例文件https://cdn.example.com/default.css ,浏览器会询问cdn.example.com的IPv4 / IPv6(A / AAAA)地址,获取none并尝试使用CNAME, some-subdomain-at.cloudfront.net. 作为答案。 现在浏览器将尝试获取some-subdomain-at.cloudfront.net.的IP地址some-subdomain-at.cloudfront.net. 并开始与这个地址的通信,就好像它在哪一个Aloggingcdn.example.com