如何在运行节点服务器的AWS EC2实例上将http重定向到https。

时间:2017-12-13 09:20:31

标签: node.js nginx amazon-ec2 elastic-load-balancer

我有一个映射流量的AWS ELB:

  • 从端口443(https)到端口3000上的EC2实例
  • 从端口80(http)到端口80上的相同EC2实例。

我的目标是让所有流量都通过https。

在那个实例上,我有一个节点服务器侦听端口3000。

我尝试在端口80上添加http server监听以重定向所有流量,但是存在一些权限问题,我还读到使用sudo命令运行服务器不是一个好习惯。

我尝试将nginx配置添加到实例,但它没有用完。

server {
    listen 80;
    server_name app.elaisian.com;
    location / {
        proxy_pass https://app.sitename.com;
    }
}

提前致谢

3 个答案:

答案 0 :(得分:0)

AWS docs开始,解决方案是使用HTTP请求的X-Forwarded-Proto标头:

server {
      listen         80;
      server_name    www.example.org;
      if ($http_x_forwarded_proto != "https") {
          rewrite ^(.*)$ https://$server_name$REQUEST_URI permanent;
      }
}

答案 1 :(得分:0)

我认为您可以使用Nginx重定向从http到https

server {
    listen 80;
    listen [::]:80;
    server_name app.elaisian.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
   server_name app.elaisian.com;
    ...
 }

您可以参考此post了解更多信息

答案 2 :(得分:0)

另一种选择是将所有流量发送到您的节点服务器并执行以下操作:

server.pre(function (req, res, next) {
    var proto = req.header('X-Forwarded-Proto');
    if (proto === 'http' && req.header('host')) {
        let query = req.getQuery() ? '?' + req.getQuery() : '';
        console.log(`Redirecting ${req.getPath()} to https...`);
        res.redirect(302, 'https://' + req.header('host') + req.getPath() + query, next);
    } else {
        next();
    }
});

这将预先检查每个请求,以查看它是否作为HTTP遇到ELB。如果是这样,它将重定向到HTTPS,保留完整的URL。它假设您使用Restify或Express。您可能需要根据您正在使用的HTTP包来调整函数调用。