1

我正在为 iPhone 客户端使用 Node.js 制作 API 服务器。我也在使用这个节点服务器来发回一些请求的文件,比如静态图像等。

现在我正在使用以下代码创建一个 https 服务器:

https.createServer(options,app).listen(app.get('port'), function(){
    console.log("Express server listening on port " + app.get('port'));
});

效果很好。

但是,我希望通过 HTTP 而不是 HTTPS 提供静态文件。这可能吗?

我正在使用以下代码提供静态文件:

app.use(express.static(path.join(__dirname, 'uploads')));

谢谢!

4

1 回答 1

4

如果您希望在同一个端口上执行此操作,这几乎是在 node.js 中的 SAME 端口上绑定 HTTP 和 HTTPS 流量的重复?.

但是,如果您有多个端口(一个用于 HTTP,一个用于 HTTPS),您可以尝试只启动两个服务器实例。创建两个应用程序(可以在同一个节点文件中完成),一个用于您的实际 API,然后一个称为 staticApp 的较小的应用程序用于提供您的静态内容。然后你启动你的 API 服务器的代码是一样的,你可以使用

http.createServer(app).listen(app.get('port'), function(){
    console.log("Static server listening on port " + app.get('port'));
});

为避免混淆,您还可以将 API 服务器中的“端口”变量的名称更改为类似于“ssl-port”的名称,这样您就不会感到困惑。

这将有效地创建两个服务器;一个通过 HTTP 为您的静态内容提供服务,而您的原始 API 服务器通过 HTTPS 提供服务。只需确保您使用的是 80/443(标准),以便协议隐含地解释端口(即http://mydomain.comhttps://mydomain.com转到正确的位置),或者您的负载平衡器或任何代理您的流量的东西正在将正确的协议发送到正确的端口。

请注意,这会给尝试通过 HTTP 访问您的 API 的任何人提供 404(很可能)。解决方案可能是添加与您的 API 端点匹配的通用路由(类似于 api/*,如果您的结构设置为这样),使用 https 协议将用户重定向到相同的路径。

回应您的评论

两个在一个文件中创建两个应用程序,只需执行以下操作:

var api = express();

api.configure(function(){
    app.set('ssl_port', [your https port]);
    //your api code
});


var static = express();

static.configure(function () {
    app.set('port', [your http port]); // Set the port
    app.use(express.static(path.join(__dirname, 'static'))); //This will serve everything inside '/static' as static content
})

也创建两个服务器:

//HTTPS Api Server
https.createServer(https_options, app).listen(app.get('ssl_port'), function(){
  console.log("Api server listening on port " + app.get('ssl_port'));
});

//HTTP Static Server
http.createServer(static).listen(static.get('port'), function () {
    console.log('Static server listening on %s', static.get('port'));
});
于 2013-03-09T18:49:53.733 回答