首页 > 解决方案 > 如何在不使用端口 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,则会发生相同的重定向问题。

我已经在互联网上搜索了很长时间,对我来说,这是任何网络应用程序的简单要求。我非常感谢有关我的策略的一些详细指导。

标签: node.jsexpresssslamazon-ec2https

解决方案


如果要保留端口 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)。


推荐阅读