Como posso garantir que o Nginx sirva arquivos de texto sem formatação como um download, em vez de embutido?

18

Eu tenho o aplicativo Rails (Redmine), que funciona com o Nginx. Se eu estiver clicando em qualquer anexo, meu navegador (Firefox, por exemplo, chrome) solicita que eu baixe o arquivo. Mas se eu estiver clicando no anexo do tipo txt, meu navegador abrirá esse arquivo no navegador.

Pelo que entendi, é tarefa do Nginx decidir - abrir o arquivo no navegador ou baixá-lo. Como posso configurá-lo?

demas
fonte

Respostas:

20

Alterando o Content-Typede .txtarquivos podem funcionar, mas é uma maneira um pouco arriscado para resolver este problema, porque você não pode garantir 100% que o navegador do usuário irá responder como você espera. Além disso, é enganoso rotular um .txtarquivo como um arquivo binário.

Em vez disso, sugiro usar a maneira padrão de forçar o download de um navegador em vez de exibir o arquivo, que é usar o Content-Dispositioncabeçalho com um valor de attachment( RFC 2183 , consulte também RFC 2616 ).

Por exemplo, esse locationbloco nginx enviará esse cabeçalho com .txtarquivos sob o /downloads/URI e, portanto, eles serão forçados a fazer o download:

location ~ ^/downloads/.*\.txt$ {
  add_header Content-Disposition "attachment";
}

Então você pode adicionar outras correspondências apropriadas, etc, apropriadas à sua configuração.

daveadams
fonte
3
Parece ser a melhor solução.
Vadim
Mas o Content-Dispositionhack no navegador chromium pode começar a dizer palavrões no console e até parar de baixar qualquer arquivo da página. Diz thinhgs (com triângulos amarelos) como:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon
4

Você precisa extrair o local do arquivo para download e definir o tipo de conteúdo como application/octet-stream.

Temos o seguinte local em nosso serviço para material promocional para download (que inclui PDFs, imagens e alguns documentos, mas tenho certeza de que também funcionará com arquivos txt):

location /promomaterial/download/ {
         add_header Content-Type application/octet-stream;
}

Todos os navegadores que tentamos baixam todos os arquivos desse local em vez de tentar exibi-los.

rvs
fonte
4
Usando "add_header" está absolutamente errado, use "default_type": location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin
@OlegNeumyvakin Por que o default_type é melhor que o add_header?
user193661
2
@ user193661 Como "add_header", ele adiciona automaticamente um novo cabeçalho "Content-Type". Assim, em resposta, você pode obter dois cabeçalhos "Content-Type", o que pode levar a um comportamento estranho dos clientes HTTP. "default_type" é definido (sobrescrito) único cabeçalho "Content-Type" em resposta.
Oleg Neumyvakin