https ELB 背后的 Http nginx 和索引自动重定向

https ELB 背后的 Http nginx 和索引自动重定向

我有一个 Amazon ELB,用于监听 http 和 https 流量。它后面的实例在端口 80 上有 nginx。仅限 Http。因此 ELB 将 https 和 http 都转发到 nginx 的 http。

当我向文件夹发出 https 请求时 https://example.com/folder 它会自动重定向到斜线版本 http://example.com/folder/ 但协议变成了 http。文件夹包含 index.html 文件。我猜这就是它工作的原因。

有什么办法可以解决这个问题吗?即将其重定向到 https 而不是 http。我无法全局强制执行 https。

我的配置:

http {
map $http_x_forwarded_proto $thescheme {
    default $scheme;
    https https;
}

server {
    listen 80;
    server_name example.com;
    location / {
        root /var/www/html;
        add_header X1 $scheme;
        add_header X2 $thescheme;
        index index.html;
    }
}
}

我添加了 X1 和 X2 标头,以检查 nginx 认为使用的协议以及 ELB 是否添加了 X-Forwarded-Proto 标头。对于示例请求,X1 是 http,X2 是 https。

我发现添加

if (-d $request_filename) {
    rewrite [^/]$ $thescheme://$http_host$uri/ permanent;
}

内部位置有帮助,但想知道是否有更好的解决方案。

答案1

  • rewrite我建议不要使用,而是遵循最佳实践并使用返回指令。使用这个可能看起来如下:

    if ($http_x_forwarded_proto = 'http') {
        return 301 https://example.com$request_uri;
    }
    
  • HTTPS此外,为了强制所有发出一次请求的客户端使用HTTPS,可以考虑添加一个HTTP 严格传输安全 (HSTS)标题。 HSTS

    一种网络安全策略机制,有助于保护网站免受协议降级攻击和 cookie 劫持。

    为了使用它,指令可能如下所示:

     add_header Strict-Transport-Security max-age=31536000;
    

相关内容