tipos nginx, x-accel-redirect e mime

9

Na minha instalação do nginx 0.8.34, estou usando o recurso X-Accel-Redirect para controlar downloads de arquivos no código do aplicativo, enquanto o aplicativo não gerencia o download.

Depois de muita dor, isso agora basicamente funciona, exceto que o nginx sempre retorna o arquivo com o text/htmltipo de conteúdo.

O tipo de conteúdo padrão é application / octet-stream, especificado no httpbloco.

O bloco do servidor contém, entre outras coisas, a definição do diretório em que os arquivos estão armazenados:

location /files {
  default_type  application/octet-stream;
  alias /srv/www/uploads;
  internal;  
}

Então, eu especifiquei o tipo de conteúdo mesmo aqui, mas nada mudou.

Não quero definir o tipo de conteúdo pelo aplicativo, porque então eu iria me atrasar (primeiro teria que determiná-lo). Então, idealmente, o nginx retornaria o tipo de mimet correto com base na extensão do arquivo (eu incluo mime.types no httpbloco).

Tomas Kohl
fonte

Respostas:

12

Se você deseja permitir que o nginx adivinhe o tipo MIME correto, basta garantir que nenhum tipo de conteúdo seja retornado do seu servidor back-end.

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response
Sebastien Estienne
fonte
1
com tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('Content-Type') como o método .clear define o tipo de conteúdo como text / html
Anthony
1

Pessoalmente, defino application / octet-stream no aplicativo, mas você pode usar o fastcgi_ignore_headers para impedir que o Nginx use o cabeçalho fornecido pelo backend.

fastcgi_ignore_headers Content-Type;
Martin Fjordvald
fonte
Obrigado pela sua resposta. Desejo servidor diferentes tipos de conteúdo para que as imagens sejam renderizadas como arquivos zip e imagens sejam oferecidas como uma opção de download. Infelizmente, isso não resolve muito bem.
Tomas Kohl
Você tentou ou está apenas assumindo que não vai funcionar? Ignorando o cabeçalho fornecido pelo backend, ele deve tentar determiná-lo com base no arquivo.
Martin Fjordvald 27/10/10
2
Não se pode ignorar Content-Type. De acordo com wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers possíveis valores são X-Accel-Redirect, X-Accel-Expires, ExpiresouCache-Control
jnns
1
"É possível especificar cabeçalhos como", enquanto frases de merda não significam "os valores possíveis são". Eu ignorei o Content-Type antes em combinação com o x-accel-redirect, então não acho que seja impossível, mas admito que não sou íntimo dos detalhes.
Martin Fjordvald 8/12
@MartinFjordvald, tentei e nginx recusou-se a começar a reclamar nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27, mas fastcgi_ignore_headers "Expires"funciona
dnozay
0

com php-fpm:

<?php
    header("Content-Type: ");
    header("X-accel-redirect: (...)");

diz ao php para não enviar um cabeçalho de tipo de conteúdo (nem mesmo um vazio), e o nginx adivinhará o tipo para você e adicionará o cabeçalho :)

hanshenrik
fonte