我可以配置expressjs通过http和其他人通过https提供某些页面吗?

时间:2011-03-01 19:47:50

标签: javascript node.js express

根据对此问题的回答:

How do I configure nodejs/expressjs to serve pages over 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和节点2.4,这是可行的吗?

2 个答案:

答案 0 :(得分: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,这不像nginx那样用于提供实时内部TCP连接。 (我在这里解释Ryan Dahl)。

答案 1 :(得分:0)

您只能通过请求所在的连接提供网页。如果请求未通过https传入,则无法以此方式发送响应。

因此,首先您必须同时监听http和https请求。如果您希望通过安全连接通过http进入请求,请不要进行任何处理,而是立即将其重定向到https网址。然后,当客户端重新发出请求时,正常处理。

如果框架使用JSGI,那么你可以使用the redirect module from Jack,否则你必须自己做。详细信息位于链接,即响应代码301和位置:标题,带有https URL。