Nginx X-Accel-Redirect不使用node.js
我正在尝试在node.js支持的nginx上设置授权文件访问。由于某种原因,所有的例子对我都不适用。我正在尝试从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
/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,没有任何东西传递到节点。我做错了什么?当我推荐outinternal
时,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无关。创建新问题