Nginx'in satır içi yerine düz metin dosyalarını indirme olarak sunduğundan nasıl emin olabilirim?


18

Nginx ile çalışan Rails uygulaması (Redmine) var. Herhangi bir eki tıklıyorsam tarayıcım (firefox, yani chrome) benden dosya indirmemi istedi. Ama eğer txt tipi eki tıklıyorsam tarayıcım bu dosyayı tarayıcıda aç.

Anladığım kadarıyla Nginx'in görevi karar vermek - dosyayı tarayıcıda açmak veya indirmek. Nasıl ayarlayabilirim?

Yanıtlar:



20

Değişen Content-Typebir .txtdosya çalışabilir, ancak kullanıcının tarayıcı beklediğiniz nasıl yanıt vereceğini% 100 garanti edemez, çünkü bu sorunu çözmek için biraz riskli bir yoldur. Ayrıca, bir .txtdosyayı ikili dosya olarak etiketlemek yanıltıcıdır .

Bunun yerine, ekranın yerine kullanmaktır dosyayı indirmek için bir tarayıcı zorlamak için standart bir yol kullanmanızı öneririz Content-Dispositiondeğerine sahip başlık attachment( RFC 2183 , ayrıca bkz RFC 2616 ).

Örneğin, bu nginx locationbloğu URI .txtaltındaki dosyaları içeren böyle bir üstbilgiyi gönderir /downloads/ve böylece indirmeye zorlanırlar:

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

Böylece, yapılandırmanıza uygun başka uygun eşleme vb. Ekleyebilirsiniz.


3
En iyi çözüm gibi görünüyor.
Vadim

Ancak Content-Dispositionkrom tarayıcı hack konsolda kötü kelimeler söylemeye başlayabilir ve hatta sayfadan herhangi bir dosyayı indirmeyi durdurabilir. Thinhgs (sarı üçgenlerle) diyor ki:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

İndirilebilir dosya için konum ayıklamanız ve içerik türünü olarak ayarlamanız gerekir application/octet-stream.

İndirilebilir promomaterial için hizmetimizde şu konuma sahibiz (pdfs, resimler ve bazı dokümanlar içerir, ancak txt dosyalarıyla da çalışacağından eminim):

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

Denediğimiz her tarayıcı, görüntülemeye çalışmak yerine tüm dosyaları bu konumdan indirir.


4
"Add_header" kullanmak kesinlikle yanlış, bunun yerine "default_type" kullanın: location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin default_type neden add_header 'den daha iyi?
user193661

2
@ user193661 "add_header" kelimenin tam anlamıyla yeni "Content-Type" üstbilgisi eklediğinden, yanıt olarak HTTP istemcilerinin tuhaf davranışlarına yol açabilecek iki "Content-Type" üstbilgisi alabilirsiniz. "default_type", yanıt olarak tek bir "İçerik Türü" üstbilgisi ayarlanır (üzerine yazılır).
Oleg Neumyvakin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.