使用 Nginx 的 X-Accel-Redirect 标头提供受保护的文件

使用 Nginx 的 X-Accel-Redirect 标头提供受保护的文件

我正在尝试使用 nginx.conf 中的以下指令来提供受保护的文件:

    location /secure/ {
        internal;
        alias   /home/ldr/webapps/nginx/app/secure/;
    }

我以以下形式传递路径:“/myfile.doc”

该文件的路径为:/home/ldr/webapps/nginx/app/secure/myfile.doc

当我访问“http://myserver/secure/myfile.doc”时,我只得到 404(在 http 后插入空格以阻止 ServerFault 将其转换为链接)

我尝试去掉位置指令末尾的 / ,但这并没有什么区别。

两个问题:

  1. 我如何解决它!
  2. 我该如何自己调试这样的问题?我该如何让 Nginx 报告它正在寻找哪条路径?error.log 什么都不显示,access.log 只告诉我正在请求哪个 URL - 这是我已经知道的部分!在没有任何反馈的情况下随机尝试是没有意思的。

这是我的整个 nginx.conf:

    daemon off;
    worker_processes 2;
    events {
        worker_connections 1024;
    }
    http {
        include             mime.types;
        default_type        application/octet-stream; 
        server {
            listen  21534;
            server_name my.server.com;
            client_max_body_size 5m;
            location /media/ {
                alias /home/ldr/webapps/nginx/app/media/;
            }
            location / {
                proxy_set_header            X-Real-IP  $remote_addr;
                proxy_set_header             X-Forwarded-For $proxy_add_x_forwarded_for;
                fastcgi_pass                unix:/home/ldr/webapps/nginx/app/myproject/django.sock;
                fastcgi_pass_header          Authorization;          
                fastcgi_hide_header          X-Accel-Redirect;
                fastcgi_hide_header          X-Sendfile;
                fastcgi_intercept_errors     off;
                include                        fastcgi_params;
            }
            location /secure {
                internal;
                alias   /home/ldr/webapps/nginx/app/secure/;
            }
        }
    }

编辑:

我正在尝试一些建议这里

所以我尝试过:

location /secure/ {
    internal;
    alias   /home/ldr/webapps/nginx/app/;
}

无论位置上有无尾随斜杠。

我也尝试过将这个块移到“location /”指令之前。

我链接到的页面在“位置”后有 ^~,内容为:

location ^~ /secure/ { ...etc...

不确定这意味着什么但它也不起作用!

答案1

看来您误解了 x-accel-redirect 的意义。此功能的意义在于允许您的后端处理身份验证、日志记录等,然后将文件服务交给 Nginx。

这意味着您不能直接访问 URI,但您的后端会发出 x-accel-redirect 标头,并且 Nginx 将为文件提供服务而不是您的后端,从而释放它来执行其他操作。

如果这就是您所说的内容,I'm passing in paths in the form: "/myfile.doc"那么您的 URI 与位置不匹配。您实际上是在向 Nginx 发出新请求,以便它进行正常的位置匹配。因此,如果您希望它匹配,location /secure/您需要向它传递一个以 开头的 URI ,/secure/然后/secure/myfile.docNginx 就会提供服务/home/ldr/webapps/nginx/app/secure/myfile.doc

答案2

尝试使用 root 而不是别名。

location /secure/ {
    internal;
    root /home/ldr/webapps/nginx/app/;
}

相关内容