我有一个 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;