【问题标题】:Express server not redirecting HTTP to HTTPSExpress 服务器未将 HTTP 重定向到 HTTPS
【发布时间】:2019-08-19 20:07:53
【问题描述】:

我正在尝试使用 ExpressJS 设置服务器,该服务器使用 HTTPS 并为 React 应用程序提供服务器。我希望将任何 HTTP 请求重定向到使用 HTTPS。

附加限制:我正在使用 React 路由器,因此服务器需要能够处理它。例如如果我请求 localhost:3000/profile,我希望 React Router 来处理它,我只需要 Express 来为 index.html 提供服务器,因为我已经去了 localhost:3000

问题:我想我已经能够设置 HTTPS(Chrome 会抱怨,但我现在不介意),但我无法进行重定向。

作为比较,这是我如何设置仅用于开发的 HTTP 服务器的代码(在我尝试设置 HTTPS 之前):

const express = require('express');
const http = require('http');
const path = require('path');
const app = express();

const DIST_DIR = path.resolve('./dist');
app.use(express.static(DIST_DIR));

app.get('*', (req, res) => {
    res.sendFile(path.resolve(DIST_DIR, './index.html'));
});

const devServer = http.createServer(app);
devServer.listen(3000);

接下来,我从this 指南开始。我创建了一个自签名 SSL 证书,然后设置了我的应用程序。然后我看了一些如何重定向的例子,比如this question

但是,它似乎不起作用。

这是我目前的代码:

app.use(express.static(DIST_DIR));

app.use((req, res, next) => {
    if (req.secure) {
        next();
    } else {
        res.redirect(`https://${req.headers.host}${req.url}`);
    }
});

app.get('*', (req, res) => {
    res.sendFile(path.resolve(DIST_DIR, './index.html'));
});

const httpServer = http.createServer(app);
httpServer.listen(3080);

const privateKey = // uses FS to get my key
const certificate = // uses FS to get my cert
const credentials = { key: privateKey, cert: certificate };
const httpsServer = https.createServer(credentials, app);
httpsServer.listen(3443);

我可以访问https://localhost:3443 并按预期导航应用程序,Express 可以正确处理/profile 等页面上的刷新。伟大的。 Chrome 抱怨“CA 根证书不受信任。将此证书安装在受信任的根证书颁发机构存储中”,但我还没有努力解决这个问题,因为在真实的生产环境中,我会获得证书和密钥来自受信任的来源。

但是,当我转到 http://localhost:3080 时,我只是在 http://localhost:3080 结束。 Chrome devtools 显示我没有使用 HTTPS。此外,我无法直接访问/profile,因为 Chrome 会提示我“此站点无法提供安全连接”的错误。

我尝试了我链接的那个 stackoverflow 问题中列出的其他方法,但它们要么具有相同的行为,要么直接不起作用。我在这里有点脱离我的元素,我正在努力学习,但我不明白为什么这不起作用。任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: node.js reactjs express react-router


    【解决方案1】:

    虽然您可以在您的应用程序中管理它,但通常惯例是在您的应用程序前面有一个像 nginix 或 apache 这样的 Web 服务器来管理 https 重定向。根据您的设置,通常在此前端服务器上管理您的证书以简化证书管理。如果您要部署到 aws 或其他云提供商,我会让他们的基础架构为您处理。

    【讨论】:

    • 感谢您的回复。不用说,这把我逼到了墙角。我找到了另一个提到这一点的指南(链接如下)。我认为这就是您所说的; Nginx 的反向代理? developer.ibm.com/tutorials/make-https-the-defacto-standard
    • 在这种情况下,Express 是否仍会使用 HTTPS 设置,并避免任何对 HTTP 的处理,因为 Nginx 会将所有内容重定向到 HTTPS?
    • 无论哪种方式都可以。如果您要部署到某个东西,那么您的应用程序通常只服务于 http。 Nodejs 应用程序倾向于水平扩展,这意味着如果不在前端服务器上管理证书,则需要多个位置来管理证书,因此只需在一个 nginix/apache/ELB 上管理 https。
    • 使用 nginix/apache 比使用您自己的自定义服务器免费加密 ssl 证书也更容易使用。
    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多