如何在 Node JS 上将 http 重定向到 https

Posted

技术标签:

【中文标题】如何在 Node JS 上将 http 重定向到 https【英文标题】:How to redirect http to https on Node JS 【发布时间】:2020-05-01 12:07:13 【问题描述】:

我正在使用 nodejs 来处理我的服务器,并且上面有一个网站。

我最近设置了 SSL,想将 http 重定向到 https,但无法做到。我在 *** 上尝试了所有批准的解决方案,但没有一个有效。

这是我的服务器应用程序:

const express = require('express');
const app = express();
const https = require('https');
const fetch = require('node-fetch');
const bcrypt = require('bcrypt');
const hogan = require('hogan.js');
const fs = require('fs');

const optionSSL = 
    key: fs.readFileSync("./etc/ssl/myssl.pem"),
    cert: fs.readFileSync("./etc/ssl/myssl.crt")
;

//app.listen(80, () => console.log("Listening at 80"));
app.use(express.static('public', 
    extensions: ['html', 'htm'],
));

app.use(express.json(limit: '1mb'));
app.use(express.urlencoded( extended: false ));

https.createServer(optionSSL, app).listen(443, "mydomain.com");

我尝试过的事情:

Automatic HTTPS connection/redirect with node.js/express

Redirect nodejs express static request to https

How do you follow an HTTP Redirect in Node.js?

【问题讨论】:

但做不到,你有任何错误,在控制台或日志中吗?任何错误代码?没有任何错误我们能做的不多。 “我在 *** 上尝试了所有已批准的解决方案,但没有一个有效。” 请链接到您尝试过的解决方案,并尽最大努力在其中之一你认为最好/最有可能工作的那些。问题中的代码根本没有尝试这样做。 实际上我在控制台上没有错误。当我转到“http://mydomain”时,浏览器无法连接并给我“ERR_CONNECTION_REFUSED” @T.J.Crowder 编辑了帖子。 我不确定listen 函数的第二个参数。 according to the doc 应该是回调。 【参考方案1】:

我通过添加这些代码解决了这个问题:

const httpApp = express();
const http = require('http');

httpApp.get("*", function(req, res, next) 
    res.redirect("https://" + req.headers.host + req.path);
);

http.createServer(httpApp).listen(80, function() 
    console.log("Express TTP server listening on port 80");
);

https.createServer(optionSSL, app).listen(443, function() 
    console.log("Express HTTP server listening on port 443" );
);

感谢@Quentin 告诉我监听两个端口的想法。

【讨论】:

【参考方案2】:
https.createServer(optionSSL, app).listen(443, "mydomain.com");

您正在侦听端口 443,这是 HTTPS 端口。

如果你想从 HTTP 重定向,那么你需要监听 HTTP 端口(而不是附加证书)。

最简单的方法是在端口 80 上运行一个完全不同的服务器(专用于执行重定向)。你可以在 Node.js 中编写一个,或者你可以使用现成的东西,比如 nginx或 lighttpd。

【讨论】:

感谢您的建议。但是当我这样做时,如何将 SSL 添加到我的网站?我已经可以访问https版本了,当有人键入http而不是https时,是否有任何方法可以添加,将其重定向到https? @KureyşAlpKılıç — 请参阅此答案的最后两段(请注意,我绝不说您应该停止侦听 HTTPS 端口)。 其实我对这些东西有点陌生。我从您所说的事情中了解到,我将再次使用 nodejs 创建一个新应用程序并在另一台服务器上运行它,这意味着服务器价格翻倍?当有人在某个服务器上连接到我的网站时,实际上有人将从不同的服务器重定向到我的实际服务器。如果这对我来说没有意义,我的意思是感觉这不是一个正确的方法。是不是我可以在我的 app.js 上写一些东西,比如为 http 使用不同的端口,当有人使用这个端口时,将某人重定向到 https 或类似的东西 "在不同的服务器上运行它意味着服务器价格翻倍?" — 不。那个相同的服务器。 “当有人在某个服务器上连接到我的网站时,实际上有人会从不同的服务器重定向到我的实际服务器。” - 不,同一台服务器。只是端口 80 而不是端口 433。

以上是关于如何在 Node JS 上将 http 重定向到 https的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WebSphere Application Server v9 上将 URL http 重定向到 https

如何在 ELB 应用程序负载均衡器上将 HTTPS 重定向到 HTTP

在 Flask+Heroku 上将 HTTP 重定向到 HTTPS

如何使用 node.js 在重定向 url 中获取元素

使用 IIS 在 ELB 上将 http 重定向到 https 的最佳方法

在没有 ServerName 的默认虚拟主机上将 HTTP 重定向到 HTTPS