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).

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

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;

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 :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.