-1

我将ELB配置为同时打开80和443,其中443配置了SSL。两个 ELB 端口都指向实例的 80 端口。ELB 的 heatlh 检查使用 ping 目标 HTTP:80/index.html。它曾经可以工作,直到我最近决定开始将 http 重定向到 https。

现在 server.js 上有以下代码(// 中的代码是我新添加的代码):

//
app.use(function(req, res, next) {
    if (config.env === 'prod' && req.get('X-Forwarded-Proto') !== 'https') {
        console.log("redirecting")
        console.log('https://' + req.get('Host') + req.url)
        res.set('X-Forwarded-Proto', 'https');
        res.redirect('https://' + req.get('Host') + req.url);
    }
    else
        next();
});
//

app.use(express.static(path.join(__dirname, 'home')));
app.set('trust proxy'); // enable this to trust the proxy

app.listen(app.get('port'), function() {
  console.log('Express server listening on port ' + app.get('port'));
});

app.get("/*", function(req, res, next) {
    res.sendFile(path.join(__dirname, 'home/index.html'));
});

我认为上述请求会将所有请求重定向到 elb 服务器,但使用 https 协议。

但是服务器开始打印:

redirecting
https://10.x.x.xx/index.html

然后 ELB 失败,因为https://10.xxxx/inde.html不可用。

但是 index.html 的位置就在 {domain}/ 下。

我认为我重定向的方式可能是错误的 - 但我不知道如何解决它。

4

2 回答 2

1

我的解决方案是在重定向之前检查健康 API 路由。

  1. 将 AWS 负载均衡器上的运行状况检查设置为 /api/health
  2. 添加条件

if (config.env === 'prod' && req.get('X-Forwarded-Proto') !== 'https' && req.url !== '/api/health') { // redirect }

于 2017-02-27T22:06:54.617 回答
0

负载均衡器健康检查请求没有x-forwarded-proto标头,因为它们没有从客户端转发,它们直接来自负载均衡器。在进行重定向之前,您可能需要先检查标头是否存在。

另外我对你的 SSL 设置有点困惑。您是否在负载均衡器上进行 SSL 终止,但也在 EC2 服务器上提供 SSL 证书?您说“两个 ELB 端口都指向实例的 80 端口”,这意味着您没有在 EC2 服务器上提供 SSL 证书,因此您的运行状况检查 URL 应该httphttps.

此外,您在重定向之前拥有的这一行根本没有完成任何事情:

res.set('X-Forwarded-Proto', 'https');
于 2017-02-27T22:01:52.630 回答