Nginx X-Accel-Redirect不使用node.js

Nginx X-Accel-Redirect不使用node.js,node.js,nginx,x-accel-redirect,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 /da

我正在尝试在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;
}  
My node 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,没有任何东西传递到节点。我做错了什么?当我推荐out
internal
时,test.jpg直接由nginx正确服务,所以我假设路径是正确的

我很确定我以前有过这样的工作,但是在不同的服务器上,可能有不同的节点和nginx版本。使用nginx1.6.0和1.2.6节点v0.10.21进行了尝试。我还添加了所有的proxy\u set\u header和proxy\u pass选项,这些选项在所有示例中都可以找到,但没有任何效果。我现在正在一个基于漂泊者的Ubuntu虚拟机上运行这个,但在Mac上也不工作


我知道我必须通过
res.setHeader(“X-Accel-Redirect”,req.url)设置标题,但这不是问题所在,因为我甚至还没有达到可以在节点中设置所需标题的阶段。

您误解了
内部
X-Accel-Redirect
的工作原理

主要的想法是,你去一些URL,这是代理的应用程序。然后应用程序决定你们是否应该访问该文件。在前一种情况下,它使用
X-Accel-Redirect
响应受保护的url(一个使用
内部

因此,您应该转到其他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);

谢谢!完全有道理,我在路上迷了路,读得越多。我一直认为请求和路径必须匹配。花上几个小时,再次感谢!嘿,Alexey,我在客户端ajax端使用它来访问nginx服务器在内部重定向上返回的文件:
http.onreadystatechange=function(){if(http.readyState==4&&http.status==200){localStorage.setItem(“授权”,http.getResponseHeader(“授权”);window.document.write(http.responseText);}
但它对我不起作用。我正在获取页面html内容作为响应正文的一部分,但它正在打开当前选项卡中的页面。你能在这方面提供帮助吗?@gonephishing nginx的内部重定向与ajax无关。创建新问题