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

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

在继续阅读之前,我试图理解/找到解决方案。从类似的问题中,我没有找到答案,或者至少不明白我做错了什么。

所以我有 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/

ELB 配置:ELB 配置

ELB 监听器

答案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 >> 44380 >> 80

也感谢@Tim花时间帮助我。

相关内容