Servindo arquivos protegidos usando o cabeçalho X-Accel-Redirect do Nginx

2

Estou tentando servir arquivos protegidos usando esta diretiva no meu nginx.conf:

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

Estou passando caminhos no formulário: "/myfile.doc"

e o caminho do arquivo seria: /home/ldr/webapps/nginx/app/secure/myfile.doc

Acabei de obter o 404 quando eu acesso "http: //myserver/secure/myfile.doc" (espaço inserido após http para parar o ServerFault convertendo-o em um link)

Eu tentei seguir a diretiva de localização / desativação e isso não faz diferença.

Duas perguntas:

  1. Como faço para corrigir isso?
  2. Como posso depurar problemas como esse? Como posso obter o Nginx para informar qual caminho está procurando? error.log não mostra nada e access.log apenas me diz qual URL está sendo requisitado - este é o bit que eu já conheço! Não é divertido tentar coisas aleatoriamente sem qualquer feedback.

Aqui está meu nginx.conf inteiro:

    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/;
            }
        }
    }

EDITAR:

Estou tentando algumas das sugestões aqui

Então eu tentei:

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

ambos com e sem a barra final no local.

Eu também tentei mover este bloco antes da diretiva "location /".

A página a qual eu estava vinculado tem ^ ~ depois de 'location' dando:

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

Não tenho certeza do que isso significa, mas também não funcionou!

    
por andybak 08.02.2010 / 14:32

2 respostas

2

Parece que você entendeu mal o ponto de x-accel-redirect. O objetivo desse recurso é permitir que o back-end manipule a autenticação, o registro em log e assim por diante e, em seguida, entregue a veiculação do arquivo para o Nginx.

Isso significa que você não acessa o URI diretamente, mas tem um back-end de x-accel-redirect e o Nginx servirá o arquivo ao contrário do seu back-end, liberando-o para fazer outras coisas.

se isso é realmente o que você faz quando diz I'm passing in paths in the form: "/myfile.doc" , então seu URI não corresponde ao local. Você está essencialmente dando um novo pedido ao Nginx para que ele faça uma correspondência de local normal. Portanto, se você quiser que ele corresponda a location /secure/ , será necessário passar um URI começando com /secure/ , como /secure/myfile.doc , e o Nginx exibirá /home/ldr/webapps/nginx/app/secure/myfile.doc

    
por 03.02.2011 / 00:36
1

Tente usar root em vez de alias.

location /secure/ {
    internal;
    root /home/ldr/webapps/nginx/app/;
}
    
por 01.09.2010 / 20:02