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 是可行的吗?

4

2 回答 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。对于生产,这件事通常在您的应用服务器 (node.js) 之外使用反向代理(如nginx. 在 nginx 中执行此操作很简单,这将使您的 node.js 进程以非 root 身份运行,并且无需让客户端直接连接到 node.js,这不像 nginx 那样为实时互连 TCP 连接提供服务(我在这里解释 Ryan Dahl 本人)。

于 2011-07-16T20:43:29.260 回答
0

您只能通过请求进入的连接提供网页。如果请求不是通过 https 进入的,则无法以这种方式发送响应。

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

如果框架使用 JSGI,那么您可能可以使用Jack 的重定向模块,否则您必须自己做。详细信息在链接中,即响应代码 301 和 Location: 带有 https URL 的标头。

于 2011-03-02T20:46:05.263 回答