मैं यह कैसे सुनिश्चित कर सकता हूं कि इनलाइन के बजाय Nginx प्लेटेक्स्ट फ़ाइलों को डाउनलोड के रूप में कार्य करता है?


18

मेरे पास रेल्स एप्लिकेशन (रेडमाइन) है जो नगनेक्स के साथ काम करता है। अगर मैं किसी भी अनुलग्नक पर क्लिक कर रहा हूं तो मेरा ब्राउज़र (फ़ायरफ़ॉक्स, यानी क्रोम) मुझे फ़ाइल डाउनलोड करने के लिए कहता है। लेकिन अगर मैं txt- टाइप अटैचमेंट पर क्लिक कर रहा हूं तो मेरा ब्राउजर इस फाइल को ब्राउजर में खोलता है।

जैसा कि मैं समझता हूं कि यह तय करना Nginx का कार्य है - ब्राउज़र में फ़ाइल खोलें या इसे डाउनलोड करें। मैं इसे कैसे सेटअप कर सकता हूं?

जवाबों:


10

Txt एक्सटेंशन के लिए डिफ़ॉल्ट प्रकार पाठ / सादा है। यह व्यवहार mime.types फ़ाइल में वर्णित है। का प्रयोग करें http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type या http://nginx.org/en/docs/http/ngx_http_core_module.html#types (शायद आवेदन / ओकटेट करने के लिए सेट ओवरराइड कर -stream)।


20

बदलने Content-Typeकी .txtफ़ाइलों काम कर सकते हैं, लेकिन यह, इस समस्या को हल करने के लिए कुछ हद तक एक जोखिम भरा तरीका है क्योंकि आप 100% है कि उपयोगकर्ता के ब्राउज़र जवाब देंगे आप कैसे उम्मीद करते हैं गारंटी नहीं दे सकते। और इसके अलावा, किसी .txtफ़ाइल को बाइनरी फ़ाइल के रूप में लेबल करना भ्रामक है ।

इसके बजाय, मैं फ़ाइल को प्रदर्शित करने के बजाय किसी ब्राउज़र को डाउनलोड करने के लिए मजबूर करने के लिए मानक तरीके का उपयोग करने का सुझाव देता हूं, जो कि Content-Dispositionहेडर का उपयोग करना है attachment( आरएफसी 2183 , आरएफसी 2616 भी देखें )।

उदाहरण के लिए, यह nginx locationब्लॉक यूआरआई के .txtतहत फाइलों के साथ इस तरह के हेडर को नीचे भेजेगा /downloads/और इस प्रकार वे डाउनलोड करने के लिए मजबूर होंगे:

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

तो आप अपने विन्यास के लिए उपयुक्त अन्य उपयुक्त मिलान, आदि जोड़ सकते हैं।


3
यह सबसे अच्छा समाधान प्रतीत होता है।
वादिम

लेकिन Content-Dispositionक्रोमियम ब्राउज़र में हैक कंसोल में बुरे शब्दों को कहना शुरू कर सकता है और यहां तक ​​कि पेज से किसी भी फाइल को डाउनलोड करना बंद कर सकता है। ऐसा लगता है कि (पीला त्रिकोण के साथ) thinhgs कहते हैं:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

आपको डाउनलोड करने योग्य फ़ाइल के लिए स्थान निकालने और उनकी सामग्री-प्रकार सेट करने की आवश्यकता है application/octet-stream

हमारे पास डाउनलोड करने योग्य प्रोमोमीटर (जिसमें पीडीएफ़, चित्र और कुछ डॉक्स शामिल हैं) के लिए हमारी सेवा में निम्नलिखित स्थान हैं, लेकिन मुझे यकीन है कि यह txt फ़ाइलों के साथ भी काम करेगा):

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

हमने जो भी ब्राउज़र आज़माया है, उन्हें प्रदर्शित करने के लिए इस स्थान से सभी फ़ाइलों को डाउनलोड करने का प्रयास किया गया है।


4
"Add_header" का उपयोग करना बिल्कुल गलत है, इसके बजाय "default_type" का उपयोग करें: स्थान / smth / {default_type एप्लिकेशन / ऑक्टेट-स्ट्रीम ;; }
ओलेग नेउमकिनिन

@OlegNeumyvakin default_type add_header से बेहतर क्यों है?
user193661

2
@ user193661 क्योंकि "add_header" यह संक्षेप में नया हेडर "कंटेंट-टाइप" जोड़ता है, इसलिए जवाब में आप दो "कंटेंट-टाइप" हेडर प्राप्त कर सकते हैं जो HTTP क्लाइंट के अजीब व्यवहार को जन्म दे सकते हैं। "default_type" जवाब में एकल "सामग्री-प्रकार" शीर्ष लेख को सेट (अधिलेखित) किया जाता है।
ओलेग नेउमकिनिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.