Bagaimana saya bisa memastikan bahwa Nginx menyajikan file plaintext sebagai unduhan, bukan inline?


18

Saya punya aplikasi Rails (Redmine) yang berfungsi dengan Nginx. Jika saya mengklik lampiran apa pun di browser saya (firefox, yaitu, chrome) minta saya untuk mengunduh file. Tetapi jika saya mengklik lampiran tipe-txt, browser saya membuka file ini di browser.

Seperti yang saya pahami, ini adalah tugas Nginx untuk memutuskan - membuka file di browser atau mengunduhnya. Bagaimana saya mengaturnya?

Jawaban:



20

Mengubah Content-Typedari .txtfile dapat bekerja, tapi itu cara yang agak berisiko untuk memecahkan masalah ini, karena Anda tidak dapat menjamin 100% bahwa browser pengguna akan merespon bagaimana Anda harapkan. Dan lebih jauh lagi, itu menyesatkan untuk memberi label .txtfile sebagai file biner.

Sebagai gantinya, saya sarankan menggunakan cara standar untuk memaksa browser mengunduh daripada menampilkan file, yaitu menggunakan Content-Dispositionheader dengan nilai attachment( RFC 2183 , lihat juga RFC 2616 ).

Misalnya, locationblok nginx ini akan mengirimkan header seperti itu dengan .txtfile - file di bawah /downloads/URI dan karenanya mereka akan dipaksa untuk mengunduh:

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

Jadi Anda bisa menambahkan pencocokan lain yang sesuai, dll, sesuai dengan konfigurasi Anda.


3
Tampaknya menjadi solusi terbaik.
Vadim

Tapi Content-Dispositionperetasan di browser chromium dapat mulai mengucapkan kata-kata buruk ke konsol dan bahkan berhenti mengunduh file dari halaman. Dikatakan thinhgs (dengan segitiga kuning) seperti:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

Anda perlu mengekstrak lokasi untuk file yang dapat diunduh dan mengatur tipe kontennya sebagai application/octet-stream.

Kami memiliki lokasi berikut pada layanan kami untuk materi promosi yang dapat diunduh (yang mencakup pdf, gambar, dan beberapa dokumen, tetapi saya yakin ini juga akan berfungsi dengan file txt):

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

Setiap browser kami telah mencoba mengunduh semua file dari lokasi ini alih-alih mencoba menampilkannya.


4
Menggunakan "add_header" itu benar-benar salah, gunakan "default_type" sebagai gantinya: location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin Mengapa default_type lebih baik daripada add_header?
user193661

2
@ user193661 Karena "add_header" secara litteral menambahkan tajuk "Content-Type" baru, jadi sebagai tanggapan Anda bisa mendapatkan dua header "Content-Type" yang dapat menyebabkan perilaku aneh klien HTTP. "default_type" disetel (ditimpa) tajuk "Tipe Konten" tunggal sebagai respons.
Oleg Neumyvakin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.