繁体   English   中英

在不使用端口 80 (http) 或端口 43 (https) 的情况下,如何在 AWS EC2 上运行的 NodeJS 中编写 SSL 重定向?

[英]How do you write an SSL redirect in NodeJS running on AWS EC2 without using port 80 (http) or port 43 (https)?

我在一个主机上有两个节点服务器。 一台 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 header 中的 8081 替换为 8443:

httpsHost = req.headers.host.replace('8081', '8443');
res.writeHead(301, {
  "Location": "https://" + httpsHost + req.url
});

现在,我已经探索了端口转发的选项,但是这将如何工作? 如果我将端口 80 和 443 转发到内部端口(比方说)3000 和 4000,则会发生相同的重定向问题。

不完全是。 When someone navigates to http://my-fun-url.com (80) the request is forwarded to 3000. Your http server will respond with a redirect to https://my-fun-url.com (443) which will被转发到 4000,https 服务器将从那里接收它。

这两种方法之间的区别在于端口 80 和 443 是默认端口,它们是隐含的,因此可以从 URL 的主机部分中省略。 这使得重定向更容易,因为首先在主机中没有要替换的端口,只有协议部分(HTTP/HTTPS)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM