Назад | Перейти на главную страницу

Обслуживание защищенных файлов с использованием заголовка 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

Я просто получаю 404, когда открываю "http: //myserver/secure/myfile.doc" (после 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', что дает:

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

Не уверен, что это означает, но это тоже не сработало!

Похоже, вы неправильно поняли суть 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.doc и Nginx будет служить /home/ldr/webapps/nginx/app/secure/myfile.doc

Попробуйте использовать root вместо псевдонима.

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