Nginx

Nginx + ELB:將所有 HTTP 重定向到 HTTPS

  • May 25, 2017

在進一步閱讀之前,我試圖了解/找到解決方案。從類似的問題中,我沒有找到答案,或者至少不明白我做錯了什麼。

所以我有 2 個 Amazon EC2 實例和一個負載均衡器 ELB。

對於每個實例,我將 NGINX 與 Gunicorn 和 Django 一起使用。

我為所有到 HTTPS 的 HTTP 請求設置了重定向。但是由於一些無法解釋的原因,重定向不起作用。

我試圖更改我的主機文件,以便我可以直接連接到其中一個實例並且重定向有效。但是當我使用 ELB 時,它不起作用。

這是一個nginx配置的例子:

upstream myserver {
   server 127.0.0.1:10032 fail_timeout=0;
}

server {
   listen                      80;
   server_name                 pub.myserver.ca;
   return                      301 https://$server_name$request_uri;
}

server {
   listen                      443;
   server_name                 pub.myserver.ca;
   ssl                         on;
   ssl_certificate             /etc/ssl/pub_myserver_ca.pem;
   ssl_certificate_key         /etc/ssl/pub_myserver_ca.key;
   ssl_protocols               TLSv1.2 TLSv1.1 TLSv1;
   access_log                  /var/log/nginx/myserver-access.log;
   error_log                   /var/log/nginx/myserver-error.log;

   keepalive_timeout           300;
   proxy_read_timeout          300;
   client_max_body_size        200M;

   location / {
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_redirect off;

       if (!-f $request_filename) {
           proxy_pass http://myserver;
           break;
       }
   }

   location /static {
       autoindex off;
       alias /home/tool/www/static;
   }
}

你有什麼想法?還是洞察力?或者我應該查看的文件?

先感謝您。

編輯

請求通過 ELB 時的 cUrl 響應:

$ curl -I http://pub.myserver.ca/client/sign-in/

HTTP/1.1 200 OK
Content-Language: en
Content-Type: text/html; charset=utf-8
Date: Tue, 23 May 2017 20:39:34 GMT
Server: nginx
Set-Cookie: csrftoken=********; expires=Tue, 22-May-2018 20:39:34 GMT; Max-Age=31449600; Path=/
Set-Cookie: sessionid=********; expires=Tue, 06-Jun-2017 20:39:34 GMT; httponly; Max-Age=1209600; Path=/
Vary: Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Connection: keep-alive

請求直接發送到伺服器時的 cUrl 響應:

$ curl -I http://pub.myserver.ca/client/sign-in/

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Tue, 23 May 2017 20:40:18 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://pub.myserver.ca/client/sign-in/

ELB 配置:負載均衡配置

ELB 監聽器

感謝@Michael-sqlbot,他幫助我解決了將使用者從 HTTP 重定向到 HTTPS 的問題。

解決方案是更改 ELB 配置中的偵聽器:我替換80 >> 44380 >> 80

還要感謝@Tim,他花時間幫助我。

您的 ELB 設置為在 http 或 https 上接受來自客戶端的請求,但通過 https 將請求全部傳遞給實例。這就是為什麼通過 ELB 的請求沒有得到 301 重定向的原因,ELB 已經有效地為您完成了。

當您直接向實例發出 http 請求時,沒有 ELB,因此您確實獲得了 301 重定向。

我懷疑 cookie 是由應用程序添加的,而不是 ELB。如果您直接向實例發出 https 請求,您可以確認這一點。我相信“httponly”部分是因為 Nginx 正在將一個 https 請求代理到一個不知道代理的 http 伺服器。您可能希望將應用程序配置為生成 https 連結。您可以使用 X-Forwarded-Proto 和類似的標頭來幫助解決此問題。

你還沒有說這會導致什麼問題。這會導致問題,還是您只是想了解系統行為?如果這不能解決您的問題,請編輯您的問題以明確說明由此導致的業務或技術問題,然後對答案發表評論。

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