我可以配置ExpressJS以通过HTTP提供某些页面,而通过HTTPS提供其他页面吗?

5

根据这个问题的回答:

如何配置nodejs/expressjs以通过https提供页面服务?

我一直在尝试设置与以下等效的内容:

var express = require('express');
var fs = require("fs");
var crypto = require('crypto');

var app = express.createServer();
var appSecure = express.createServer();
var privateKey = fs.readFileSync('privatekey.pem').toString();
var certificate = fs.readFileSync('certificate.pem').toString();
var credentials = crypto.createCredentials({key: privateKey, cert: certificate});
appSecure.setSecure(credentials);


app.get('/secretStuff', function(req,res) {
//redirect to https
}

appSecure.get('/secretStuff', function(req, res) {
//show you the secret stuff
}

当前版本的expressjs和node 2.4能否做到这一点?

2个回答

3

是的,这是可以实现的,看起来你已经有了大部分需要的东西。只需在你的app.get处理程序中发送重定向即可。

app.get('/secretStuff', function(req,res) {
  res.redirect('https://' + req.header('Host') + req.url);
}

还要确保像 app.listen(80)appSecure.listen(443) 这样的操作实际上在适当的端口上启动服务器。否则,请确保使用正确的端口构建 HTTPS URL。对于生产环境,这个问题通常是通过反向代理(如 nginx)在应用服务器(node.js)之外处理的。在 nginx 中执行此操作非常简单,这将使您的 node.js 进程以非 root 用户身份运行,并消除需要直接连接到 node.js 的客户端的需求,因为在提供实时互联网 TCP 连接方面,node.js 不如 nginx 经过历练(我在这里引用了 Ryan Dahl 自己的话)。

0

您只能通过请求连接来提供网页。如果请求未通过https进入,则不能以此方式发送响应。

因此,首先必须同时监听http和https请求。如果收到一个要在安全连接上回答的http请求,请不要进行任何处理,而是立即将其重定向到https URL。然后当客户端重新发出请求时,就像通常一样进行处理。

如果框架使用JSGI,则可能可以使用Jack中的重定向模块,否则您需要自己完成它。详细信息请参见链接,即301响应代码和带有https URL的Location:头。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接