Come posso assicurarmi che Nginx serva i file di testo normale come download, invece che in linea?


18

Ho un'applicazione Rails (Redmine) che funziona con Nginx. Se sto facendo clic su un allegato, il mio browser (Firefox, ad esempio Chrome) mi chiede di scaricare il file. Ma se faccio clic sull'allegato di tipo txt, il mio browser apre questo file nel browser.

A quanto ho capito, è compito di Nginx decidere: aprire il file nel browser o scaricarlo. Come posso installarlo?

Risposte:



20

La modifica Content-Typedei .txtfile può funzionare, ma è un modo un po 'rischioso per risolvere questo problema, perché non puoi garantire al 100% che il browser dell'utente risponda come ti aspetti. Inoltre, è fuorviante etichettare un .txtfile come file binario.

Invece, suggerisco di usare il modo standard per forzare il download di un browser piuttosto che per visualizzare il file, ovvero utilizzare l' Content-Dispositionintestazione con un valore di attachment( RFC 2183 , vedere anche RFC 2616 ).

Ad esempio, questo locationblocco nginx invierà tale intestazione con .txtfile sotto l' /downloads/URI e quindi saranno costretti a scaricare:

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

Quindi potresti aggiungere altre corrispondenze appropriate, ecc. Appropriate alla tua configurazione.


3
Sembra essere la soluzione migliore.
Vadim,

Ma l' Content-Dispositionhacking nel browser chromium può iniziare a dire parolacce nella console e persino interrompere il download di qualsiasi file dalla pagina. Dice thinhgs (con triangoli gialli) come:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon,

4

È necessario estrarre la posizione per il file scaricabile e impostarne il tipo di contenuto come application/octet-stream.

Sul nostro servizio è disponibile la seguente posizione per il promomaterial scaricabile (che include pdf, immagini e alcuni documenti, ma sono sicuro che funzionerà anche con i file txt):

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

Ogni browser che abbiamo provato scarica tutti i file da questa posizione invece di provare a visualizzarli.


4
Usare "add_header" è assolutamente sbagliato, usa invece "default_type": location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin,

@OlegNeumyvakin Perché default_type è meglio di add_header?
user193661

2
@ user193661 Perché "add_header" aggiunge letteralmente la nuova intestazione "Content-Type", quindi in risposta puoi ottenere due intestazioni "Content-Type" che possono portare a comportamenti strani dei client HTTP. "default_type" è impostato (sovrascrivi) intestazione "Content-Type" singola in risposta.
Oleg Neumyvakin il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.