Nginx

將 Amazon ELB 後面的所有 http 請求重定向到 https 而不使用 if

  • September 18, 2018

目前我有一個 ELB 服務於http://www.example.org>和<https://www.example.org

我想設置它,以便任何指向http://www.example.org>的請求都重定向到<https://www.example.org

ELB 將 https 請求作為 http 請求發送,因此使用:

server {
     listen         80;
      server_name    www.example.org;
      rewrite        ^ https://$server_name$request_uri? permanent;
}

將不起作用,因為對https://www.example.org的請求仍將發送到 nginx 上的埠 80。

我知道可以將其重寫為

server {
     listen         80;
     server_name    www.example.org;
     if ($http_x_forwarded_proto != "https") {
         rewrite ^(.*)$ https://$server_name$1 permanent;
     }
}

但是我讀到的所有內容都if應該在 nginx 配置中不惜一切代價避免,這將適用於每個請求。此外,這意味著我必須為執行狀況檢查設置一個特殊的單獨配置(如此處所述:“……當你在 ELB 後面時,ELB 充當 HTTPS 端點並且只向你的伺服器發送 HTTP 流量,你破壞以 HTTP 200 OK 響應響應 ELB 需要的執行狀況檢查的能力”)。

我正在考慮將登錄名放在 Web 應用程序的程式碼中,而不是 nginx 配置中(出於這個問題的目的,我們假設它是一個基於 Django 的應用程序),但我不確定這是否會比在if 配置。

如果它像那樣正常工作,請不要害怕。http://wiki.nginx.org/IfIsEvil

重要的是要注意 if 的行為不是不一致的,給定兩個相同的請求,它不會隨機地在一個上失敗並在另一個上工作,並且可以使用適當的測試和理解 ifs。不過,使用其他可用指令的建議仍然非常適用。

  1. 設置您的 AWS ELB 映射 ELB:80 到 instance:80 和 ELB:443 到 instance:1443。
  2. 綁定 nginx 監聽 80 和 1443 埠。
  3. 將到達埠 80 的請求轉發到埠 443。
  4. 健康檢查應該是 HTTP:1443。它拒絕 HTTP:80,因為 301 重定向。

aws elb 設置

NGINX 設置

   server {
      listen         80;
      server_name    www.example.org;
      rewrite        ^ https://$server_name$request_uri? permanent;
   }

   server {
      listen         1443;
      server_name    www.example.org;
  } 

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