Nginx X-Accel-Redirect不与node.js一起使用

时间:2014-05-28 06:45:41

标签: node.js nginx x-accel-redirect

我正在尝试在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);设置标头,但这不是问题,因为我甚至没有进入可以在节点中设置所需标头的阶段。

1 个答案:

答案 0 :(得分:5)

您误解了internalX-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);