在继续阅读之前,我试图理解/找到解决方案。从类似的问题中,我没有找到答案,或者至少不明白我做错了什么。
所以我有 2 个 Amazon EC2 实例和一个负载均衡器 ELB。
对于每个实例,我都将 NGINX 与 Gunicorn 和 Django 一起使用。
我设置了将所有 HTTP 请求重定向到 HTTPS。但由于某些无法解释的原因,重定向不起作用。
我尝试更改主机文件,以便能够直接连接到其中一个实例,并且重定向有效。但是当我使用 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/
答案1
您的 ELB 设置为接受来自 http 或 https 上的客户端的请求,但将请求全部通过 https 传递给实例。这就是通过 ELB 发出的请求不会获得 301 重定向的原因,ELB 实际上已经为您完成了此操作。
当您直接向实例发出 http 请求时,没有 ELB,因此您会得到 301 重定向。
我怀疑这些 cookie 是由应用程序添加的,而不是 ELB。如果您直接向实例发出 https 请求,则可以确认这一点。我相信“httponly”部分是因为 Nginx 正在将 https 请求代理到 http 服务器,而该服务器不知道代理。您可能需要配置应用程序以生成 https 链接。您可能能够使用 X-Forwarded-Proto 和类似的标头来帮助实现这一点。
您还没有说明这会导致什么问题。这会导致问题吗,还是您只是想了解系统行为?如果这不能解决您的问题,请编辑您的问题以明确说明这会导致的业务或技术问题,然后对答案进行评论。
答案2
感谢@Michael-sqlbot 帮助我解决了问题,即将用户从 HTTP 重定向到 HTTPS。
解决方案是更改 ELB 配置中的侦听器:我将其替换80 >> 443
为80 >> 80
也感谢@Tim花时间帮助我。