目前我有一个 ELB 服务于http://www.example.org和https://www.example.org。
我想设置它,以便任何指向http://www.example.org的请求都重定向到https://www.example.org。
ELB 将 https 请求作为 http 请求发送,因此使用:
server {
listen 80;
server_name www.example.org;
rewrite ^ https://$server_name$request_uri? permanent;
}
将不起作用,因为对https://www.example.org的请求仍将发送到 nginx 上的端口 80。
我知道可以将其重写为
server {
listen 80;
server_name www.example.org;
if ($http_x_forwarded_proto != "https") {
rewrite ^(.*)$ https://$server_name$1 permanent;
}
}
但是我读到的所有内容都if
应该在 nginx 配置中不惜一切代价避免,这将适用于每个请求。此外,这意味着我必须为运行状况检查设置一个特殊的单独配置(如此处所述:“......当你在 ELB 后面时,ELB 充当 HTTPS 端点并且只向你的服务器发送 HTTP 流量,你破坏以 HTTP 200 OK 响应响应 ELB 需要的运行状况检查的能力”)。
我正在考虑将登录名放在 Web 应用程序的代码中,而不是 nginx 配置中(出于这个问题的目的,我们假设它是一个基于 Django 的应用程序),但我不确定这是否会比在if
配置。
NGINX 设置
如果它像那样正常工作,请不要害怕。http://wiki.nginx.org/IfIsEvil
该解决方案使用条件逻辑,但正如公认的答案所暗示的那样,我也认为这没问题。参考:https ://stackoverflow.com/questions/4833238/nginx-conf-redirect-multiple-conditions
此外,这不需要在图像的 aws 安全设置中打开任何其他端口。您可以终止 AWS LB 中的 ssl,并将 https 流量路由到您实例上的 http 端口 80。
在此示例中,LB 健康检查在端口 80 上命中 /health,该端口路由到应用程序服务器,因此健康检查验证 nginx 和您的应用程序都在呼吸。
您现在可以在 AWS 负载均衡器设置中创建一个新的侦听器,它将 HTTP 端口 80 重定向到 HTTPS 端口 443。因此您不再需要触摸 nginx/apache 配置。