É possível restringir o download por tipo MIME / tipo de conteúdo no nginx?

1

Eu tenho a estrofe a seguir na configuração do meu host virtual nginx. O objetivo é permitir somente downloads diretos (de links diretos) de apenas tipos de conteúdo de vídeo e retornar um erro 404 ou outro erro para qualquer outra coisa:

location ~* ^/webdata/.+(\.mp4|\.m4v|\.mpg|\.mpeg|\.mpg|\.mts|\.avi)$ { root /srv/data; }

Como você pode ver, o texto acima é bastante grosseiro, correspondendo ao final do URL solicitado. Se ela não terminar em .mp4 , .m4v , .mpg , etc., a estrofe não será acionada e o cliente não obterá o arquivo.

Idealmente, eu gostaria de ser capaz de fazer algo assim (isso obviamente não funciona, já que $content_type refere-se ao cabeçalho de reqest HTTP do tipo de conteúdo do cliente, e não ao tipo de conteúdo do recurso solicitado, se não me engano):

location /webdata { if ($content_type =~ 'video/.*') { root /srv/data/; } }

Existe uma maneira de fazer isso?

Comentário: Baseado em pergunta 577471 , parece que o nginx se baseia puramente em nomes de arquivos / URI, em vez de usar algo como MIME magic para descobrir o tipo de conteúdo baseado em cabeçalhos de conteúdo de arquivos reais, como a maioria dos ambientes de desktop Linux modernos. Se isso for verdade, isso pode não ser possível.

    
por Rouben 22.12.2017 / 05:55

1 resposta

2

Nas instalações nginx padrão, existe um arquivo chamado mime.types , que mapeia as extensões de arquivo para os tipos MIME.

Assim, para solicitações de arquivos estáticos, o nginx verifica a extensão do arquivo a ser enviado ao cliente e, em seguida, pesquisa o mime.types what Content-Type header para enviar ao cliente.

Portanto, não pode haver mágica MIME em location blocos.

Se você quisesse dizer que o nginx pegaria o tipo MIME baseado no conteúdo do arquivo, isso seria muito ineficiente.

Atualmente, quando o nginx está atendendo a solicitação, ele procura o tipo MIME da tabela e adiciona o cabeçalho do tipo MIME. Em seguida, ele abrirá o arquivo e basicamente o copia para o soquete do cliente.

No entanto, se alguém desejar que o nginx selecione o tipo MIME com base no conteúdo do arquivo, no pior caso ele terá que ler e interpretar o arquivo inteiro para descobrir o tipo de arquivo correto. Isso exigiria muito mais CPU e tornaria o desempenho muito pior. Essa é a razão pela qual não existe tal recurso no nginx.

A melhor abordagem é ter extensões adequadas para os arquivos que você está enviando para os clientes.

Se isso não for possível, você deverá implementar essa inspeção de conteúdo de arquivo no idioma de sua preferência.

    
por 22.12.2017 / 06:36