我正在尝试在node.js支持的nginx上设置授权文件访问权限。由于某种原因,所有的例子都不适合我。我正在尝试从/data/private/files
我的nginx配置:
...
server {
listen 4000;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:3000/;
}
location /files {
root /data/private;
internal;
}
我的节点server.js:
var http = require('http');
http.createServer(function (req, res) {
console.log(req.url);
res.end('works');
}).listen(3000);
当我请求http://localhost:4000/xyz
时,请求正确传递给节点。当我请求http://localhost:4000/files/test.jpg
时,我只得到一个404,没有任何东西传递给节点。我究竟做错了什么?当我推荐internal
时,n.x直接正确地提供了test.jpg,所以我假设路径是正确的?
我很确定我之前有过这样的工作,但在不同的服务器上可能有不同的节点和nginx版本。尝试使用nginx 1.6.0和1.2.6,节点v0.10.21。我还添加了在所有示例中找到的所有proxy_set_header和proxy_pass选项,没有任何效果。我现在正在基于Vagrant的Ubuntu VM中运行它,但是在Mac上也不行。
我知道我必须通过res.setHeader("X-Accel-Redirect", req.url);
设置标头,但这不是问题,因为我甚至没有进入可以在节点中设置所需标头的阶段。
答案 0 :(得分:5)
您误解了internal
和X-Accel-Redirect
的工作方式。
主要想法是你去一些代理app的URL。然后app决定是否应该访问文件。在前一种情况下,它会使用X-Accel-Redirect
对受保护的网址(internal
)进行回复。
所以你应该转到其他网址,例如http://localhost:4000/get/files/test.jpg
您的应用程序可能如下所示:
var http = require('http');
http.createServer(function (req, res) {
if (req.url.indexOf('/get/files/') == 0) {
if (userHasRightToAccess()) {
res.setHeader('X-Accel-Redirect', res.url.slice(4));
res.end('');
} else {
// return some error
}
} else {
console.log(req.url);
res.end('works');
}
}).listen(3000);