node.js - 如何在不使用端口 80 (http) 或端口 43 (https) 的情况下在 AWS EC2 上运行的 NodeJS 中编写 SSL 重定向?
问题描述
我在一个主机上有两个节点服务器。一台 HTTP 服务器负责重定向到 HTTPS,一台 HTTPS 服务器负责为我的应用程序提供服务:
const express = require('express');
const https = require('https');
const http = require('http')
const fs = require('fs');
const app = express();
const httpsOptions = {
key: fs.readFileSync('./local-ssl/key.pem'),
cert: fs.readFileSync('./local-ssl/cert.pem'),
passphrase: '*****'
}
//other stuff
http.createServer(function (req, res) {
res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url });
res.end();
}).listen(80);
https.createServer(httpsOptions, app).listen(443)
这在当地很有效。
问题是,当我在 AWS EC2 上部署此代码并运行这些服务器时,您无法在端口 80 和 443 上启动服务器。我试图弄清楚如何解决这个问题。如果我在不同的端口上运行它们,服务器将不会响应,更糟糕的是,重定向不正确。
示例:如果我在 8081 上提供 HTTP,在 8443 上提供 HTTPS,当发生重定向时,代码将重定向到
https://my-fun-url.com:8081
这当然不起作用,因为我没有响应端口 8081 上的 HTTPS。
现在,我已经探索了端口转发的选项,但是这将如何工作?如果我将端口 80 和 443 转发到内部端口(比方说)3000 和 4000,则会发生相同的重定向问题。
我已经在互联网上搜索了很长时间,对我来说,这是任何网络应用程序的简单要求。我非常感谢有关我的策略的一些详细指导。
解决方案
如果要保留端口 8081 和 8443,则只需在host
标头中将 8081 替换为 8443:
httpsHost = req.headers.host.replace('8081', '8443');
res.writeHead(301, {
"Location": "https://" + httpsHost + req.url
});
现在,我已经探索了端口转发的选项,但是这将如何工作?如果我将端口 80 和 443 转发到内部端口(比方说)3000 和 4000,则会出现相同的重定向问题。
不完全是。当有人导航到http://my-fun-url.com
(80) 时,请求被转发到 3000。您的 http 服务器将响应重定向到https://my-fun-url.com
(443),该重定向将被转发到 4000,并且 https 服务器将从那里获取它。
这两种方法之间的区别在于端口 80 和 443 是默认端口,它们是隐含的,因此可以从 URL 的主机部分中省略。这使得重定向更容易,因为首先在主机中没有要替换的端口,只有协议部分(HTTP/HTTPS)。
推荐阅读
- c++ - 如何在没有第三方库的情况下为雪人制作动画?
- python - 在 pyplot 中创建具有多个不同 y 轴刻度的绘图
- javascript - Gulp 缩小多个 .js .css 文件然后链接错误
- python - 尽管已安装,但无法在 Jupyter Notebooks 中找到 TensorFlow 模块
- c++ - 从输入文件中获取数据以输出到文件
- kubernetes - gke 和自动创建的域以启用 http 路由
- algorithm - 埃及乘法算法复杂度?
- visual-studio-code - VScode SSH扩展卡在安装步骤
- python - socket.gethostbyaddr 在本地主机上使用时会引发错误
- css - CSS:文本渐变后面的线