EC2 Ubuntu NGINX config HTTPS Redirect giving me error: ERR_TOO_MANY_REDIRECTS

EC2 Ubuntu NGINX config HTTPS Redirect giving me error: ERR_TOO_MANY_REDIRECTS

背景

我在 AWS EC2 实例(Node/Express 应用程序)上有一台 Ubuntu 机器 运行,其 SSL 证书设置使用证书管理器和负载均衡器。这对于直接使用 https 访问我的站点非常有效,例如 https://example.com。但是,使用 http,导致连接不安全。

正在检查 whynopadlock.com,我被告知我的网络服务器没有强制使用 HTTPS。我的 Web 服务器是使用 NGINX 作为我的 EC2 实例私有 IP 的反向代理设置的。我四处寻找,但似乎无法找到像我这样的合适示例,尽管我已尝试拼凑我能够找到的内容。

当我尝试设置强制 HTTPS 重定向时,我得到 ERR_TOO_MANY_REDIRECTS

之前:原始 Nginx 配置

server {
    listen 80;
    location / {
        proxy_pass http://{{MASKED_EC2_INSTANCE_PRIVATE_IP_FOR_POST}}:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Notes: This config allowed https://example.com to load fine, however there was no redirect if navigating to the site using http://example.com and resulted an insecure connection.

之后:添加 HTTPS 重定向后的 NGINX 配置

# HTTP
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  localhost;
    return 301   https://$host$request_uri;
}

# HTTPS
server {
    listen       443 default_server;
    listen       [::]:443 default_server;
    server_name  localhost;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass https://{{MASKED_EC2_INSTANCE_PRIVATE_IP_FOR_POST}}:8000;
        proxy_set_header X-Forwarded-Proto https;
    }
}

问题

我现在看到,当我使用 http 加载域时,我被成功重定向到 https,但是我收到错误 ERR_TOO_MANY_REDIRECTS.

任何人都可以帮助我了解我在配置中遗漏了什么或可能做错了什么吗?

由于您使用的是 ALB,因此您可以在 ALB 本身上将 http 重定向到 https。 AWS 提供了如何设置的指南:

How can I redirect HTTP requests to HTTPS using an Application Load Balancer?

该过程涉及创建 http 侦听器并向其添加 重定向操作 而不是常规的转发规则。这样您就不必对您的实例执行任何更改,因为一切都由 ALB 处理。

此外,由于您使用的是 AWS Certificate Manager,因此您必须使用 ALB,因为 ACM SSL 证书不能用于实例。 ACM 只能用于负载均衡器(ALB、CLB 或 NLB)、CloudFront 发行版或 API 网关。