Nginx + ELB:將所有 HTTP 重定向到 HTTPS
在進一步閱讀之前,我試圖了解/找到解決方案。從類似的問題中,我沒有找到答案,或者至少不明白我做錯了什麼。
所以我有 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/
感謝@Michael-sqlbot,他幫助我解決了將使用者從 HTTP 重定向到 HTTPS 的問題。
解決方案是更改 ELB 配置中的偵聽器:我替換
80 >> 443
為80 >> 80
還要感謝@Tim,他花時間幫助我。
您的 ELB 設置為在 http 或 https 上接受來自客戶端的請求,但通過 https 將請求全部傳遞給實例。這就是為什麼通過 ELB 的請求沒有得到 301 重定向的原因,ELB 已經有效地為您完成了。
當您直接向實例發出 http 請求時,沒有 ELB,因此您確實獲得了 301 重定向。
我懷疑 cookie 是由應用程序添加的,而不是 ELB。如果您直接向實例發出 https 請求,您可以確認這一點。我相信“httponly”部分是因為 Nginx 正在將一個 https 請求代理到一個不知道代理的 http 伺服器。您可能希望將應用程序配置為生成 https 連結。您可以使用 X-Forwarded-Proto 和類似的標頭來幫助解決此問題。
你還沒有說這會導致什麼問題。這會導致問題,還是您只是想了解系統行為?如果這不能解決您的問題,請編輯您的問題以明確說明由此導致的業務或技術問題,然後對答案發表評論。