Як я можу переконатися, що Nginx подає файли в простому форматі як завантаження, а не вбудовані?


18

У мене є програма Rails (Redmine), яка працює з Nginx. Якщо я натискаю будь-яке вкладення мого браузера (Firefox, тобто хром), попросіть мене завантажити файл. Але якщо я натискаю на вкладку типу txt, у моєму браузері відкриється цей файл у браузері.

Як я розумію, завдання Nginx вирішити - відкрити файл у браузері або завантажити його. Як я можу це налаштувати?

Відповіді:



20

Зміна Content-Typeз .txtфайлів може працювати, але це досить ризикований спосіб вирішити цю проблему, тому що ви не можете гарантувати 100% , що браузер користувача буде реагувати , як ви очікуєте. А ще помилково маркувати .txtфайл як бінарний файл.

Натомість я пропоную використовувати стандартний спосіб змусити браузер завантажувати, а не відображати файл, тобто використовувати Content-Dispositionзаголовок зі значенням attachment( RFC 2183 , див. Також RFC 2616 ).

Наприклад, цей locationблок nginx відправить такий заголовок з .txtфайлами під /downloads/URI, і таким чином вони будуть змушені завантажувати:

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

Таким чином, ви можете додати інші відповідні збіги тощо, відповідні вашій конфігурації.


3
Здається, це найкраще рішення.
Вадим

Але Content-Dispositionзлом у браузері з хрому може почати говорити погані слова в консоль і навіть припинити завантажувати будь-які файли зі сторінки. На ньому написано худі (з жовтими трикутниками) на кшталт:"Resource interpreted as Document but transferred with MIME type image/png:"
Накілон

4

Вам потрібно витягнути розташування для завантажуваного файлу та встановити їх тип вмісту як application/octet-stream.

У нашому сервісі є наступне розташування для завантажуваного рекламного матеріалу (який включає в себе pdfs, зображення та деякі документи, але я впевнений, що він також буде працювати з файлами txt):

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

Кожен браузер, який ми намагалися, завантажує всі файли з цього місця, а не намагатися їх відображати.


4
Використовуючи "add_header" абсолютно неправильно, використовуйте замість "default_type": location / smth / {default_type application / octet-stream ;; }
Олег Неумывакін

@OlegNeumyvakin Чому типовий_тип кращий, ніж add_header?
користувач193661

2
@ user193661 Оскільки "add_header" це літерально додає новий заголовок "Content-Type", тож у відповідь ви можете отримати два заголовки "Content-Type", що може призвести до дивної поведінки клієнтів HTTP. "default_type" встановлює у відповідь єдиний заголовок "Content-Type".
Олег Неумывакін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.