4

我正在尝试在由 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,test.jpg 直接由 nginx 正确提供,所以我假设路径是正确的?

我很确定我之前在某个时候有过这个工作,但是在某个不同的服务器上可能有不同的节点和 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);,但这不是这里的问题,因为我什至没有进入可以在 node.js 中设置所需标头的阶段。

4

1 回答 1

6

你误解了如何internalX-Accel-Redirect工作。

主要思想是您转到某个代理到应用程序的 URL。然后应用程序决定您是否应该访问文件。在前一种情况下,它会响应X-Accel-Redirect受保护的 url(一个带有internal)。

因此,您应该转到其他一些 URL,例如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);
于 2014-05-28T07:03:44.613 回答