我正在为一个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')));
谢谢!
答案 0 :(得分:4)
如果您希望在同一端口上执行此操作,这几乎与Binding HTTP and HTTPS traffic on the SAME port in node.js?重复。
但是,如果您有多个端口(一个用于HTTP,一个用于HTTPS),您可以尝试启动服务器的两个实例。创建两个应用程序(可以在同一个节点文件中完成),一个用于实际的API,然后是一个较小的应用程序,例如,staticApp用于提供静态内容。然后,启动API服务器的代码是相同的,您可以使用
http.createServer(app).listen(app.get('port'), function(){
console.log("Static server listening on port " + app.get('port'));
});
为了避免混淆,您还可以将API服务器中'port'变量的名称更改为'ssl-port',这样您就不会感到困惑。
这将有效地创建两个服务器;一个通过HTTP提供静态内容,并通过HTTPS保留原始API服务器服务。请确保您使用的是80/443(标准),以便端口被协议隐含解释(即http://mydomain.com和https://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'));
});