Nginx
將 Amazon ELB 後面的所有 http 請求重定向到 https 而不使用 if
目前我有一個 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。不過,使用其他可用指令的建議仍然非常適用。
- 設置您的 AWS ELB 映射 ELB:80 到 instance:80 和 ELB:443 到 instance:1443。
- 綁定 nginx 監聽 80 和 1443 埠。
- 將到達埠 80 的請求轉發到埠 443。
- 健康檢查應該是 HTTP:1443。它拒絕 HTTP:80,因為 301 重定向。
NGINX 設置
server { listen 80; server_name www.example.org; rewrite ^ https://$server_name$request_uri? permanent; } server { listen 1443; server_name www.example.org; }