目前,我有一个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;
}
}
但是我读到的所有资料都说在nginx配置中应该尽量避免使用if,而且这适用于每个请求。此外,这意味着我必须为健康检查设置一个特殊的独立配置(如这里所描述的:“...当您位于ELB后面时,ELB充当HTTPS端点,并仅将HTTP流量发送到您的服务器,这会破坏ELB需要的健康检查的HTTP 200 OK响应能力。”)。
我正在考虑将登录放在Web应用程序的代码中,而不是nginx配置中(假设这是基于Django的应用程序),但我不确定这是否比配置中的if更加繁琐。
