Nodejs&表示重定向到https不适用于主页

时间:2017-09-03 14:33:48

标签: node.js angular express

我正在使用express在我的vps上提供静态文件。 我创建了两个服务器httphttps,如下所示:

var httpServer = http.createServer(app);
httpServer.listen(httpPort);

var httpsServer = https.createServer(credentials, app);
httpsServer.listen(httpsPort);

使用下面的中间件:

app.use(function (req, res, next) { 
    !req.secure 
        ? res.redirect(301, path.join('https://', req.get('Host'), req.url)) 
        : next();
});

我的大多数请求都被重定向到https。但是,当我的网站只加载没有ssl(http://example.com)且没有任何子路由(如http://example.com/contact)的域时,这不会重定向到https。

修改

我提供静态文件(为生产编译的角度4应用程序):

app.use(express.static(path.join(__dirname, distFolder)));

我的路线如下:

app.get('*', (req, res) ={ 
    res.sendFile(path.join(__dirname, distFolder, 'index.html'));
});
你可以帮我找出我错过的东西吗?我没有找到这个问题的答案。

谢谢。

4 个答案:

答案 0 :(得分:2)

我们还可以使用node-rest-client正确地重定向到任何网址。

您可以按npm install node-rest-client

安装

答案 1 :(得分:1)

path.join用于将路径元素连接在一起,不应用于构造URL。在您的示例中,重定向网址将缺少一个主斜杠。

> path.join('https://', 'example.com', '/hello/world')
'https:/example.com/hello/world'

相反,您可以使用url.format,这将构建一个合适的网址。

> url.format({ protocol: 'https:', host: 'example.com', pathname: '/hello/world' })
'https://example.com/hello/world'

您的代码看起来像这样:

app.use(function (req, res, next) {
  if (req.secure) return next()

  const target = url.format({
    protocol: 'https:',
    host: req.get('Host'),
    pathname: req.url
  })

  res.redirect(301, target)
})

答案 2 :(得分:0)

我建议您尝试在Web服务器层而不是应用层上解决此问题,通过80和443同时接收安全和非安全请求/流量。

答案 3 :(得分:0)

我终于找到了问题:我在安全测试之前正在服务公共文件夹 ...

以下是现在的步骤:

// Step 1: Test all incoming requests (from http and https servers).

app.use(function (req, res, next) {
    if (req.secure) 
        return next();

    var target = url.format({ // Thanks Linus for the advice!
        protocol: 'https:',
        host: req.hostname,
        pathname: req.url
    });

    res.redirect(301, target);
});

// Step 2: Serve static files.

app.use(express.static(path.join(__dirname, 'your/dist/folder')));

// Step 3: Build routes (in my case with * because of the SPA).

app.get('*', function (req, res) {
    res.sendFile(path.join(__dirname, 'your/dist/folder', 'index.html'));
});

现在它完美无缺!