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

使用 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;
    }

这基本上是可行的。Lets Encrypt 的东西安装正确。但是,我也有一些子域名是 Cloudfront 的 CNAME。所以这些就像cdn.example.com。我如何确保它们也能正常工作,并且不会重新路由到https://example.com

在 Cloudfront 中,已为以下 CNAME 启用默认 Cloudfront 证书:

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

这是一个问题吗?

问题是,当我访问此网站时https://example.com,所有内容都会加载,但图像、CSS 和 JS 文件(通过cdn.example.comCloudfront cname 加载)不会加载。Chrome 会在这些资产的位置栏中显示红色的“不安全”,并显示一条大错误消息,如下所示:https://i.stack.imgur.com/cua6p.jpg

将我自己的 CNAME CDN 路径与域名一起包含的正确方法是什么?感谢您的任何指点。

答案1

让我们从一些假设开始:

  • 你的 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.
    

在这种情况下,您的网络服务器(9.9.9.9)永远不会看到任何属于 cdn.example.com 的请求。

为什么?

  • 加载时示例.com网络浏览器会获取 IP9.9.9.9来自 DNS 系统并向那里发送请求。
  • 访问示例文件时,https://cdn.example.com/default.css浏览器会要求输入 IPv4/IPv6 (A / AAAA) 地址cdn.example.com,没有结果,然后尝试 CNAME,它将得到some-subdomain-at.cloudfront.net.答案。现在浏览器将尝试获取的 IP 地址some-subdomain-at.cloudfront.net.并开始与该地址通信,就好像它是的 A 记录一样cdn.example.com

相关内容