Nginx

使用 https (SSL) 在 Nginx 上執行多個域和子域

  • February 17, 2017

我有一個需要在 SSL 上執行的 Nginx 安裝。對於該域,我的伺服器塊如下,它強制example.comandwww.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 在這些資產的位置欄中顯示紅色“不安全”,並顯示如下大錯誤消息:http: //imgur.com/4sGWuIY

將我自己的 CNAME CDN 路徑與域一起包含的正確方法是什麼?感謝您的任何指點。

讓我們從一些假設開始:

  • 您的 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 的請求。

為什麼?

  • 載入example.com時,網路瀏覽器將從 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.作為答案。現在瀏覽器將嘗試獲取 的 IP 地址some-subdomain-at.cloudfront.net.並開始與該地址通信,就好像它在 A 記錄中一樣cdn.example.com

引用自:https://serverfault.com/questions/832589