Как я могу убедиться, что Nginx загружает незашифрованные текстовые файлы вместо встроенных?

18

У меня есть приложение Rails (Redmine), которое работает с Nginx. Если я нажимаю на какое-либо вложение, мой браузер (Firefox, т.е. Chrome) попросит меня загрузить файл. Но если я нажимаю на вложение типа 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";
}

Таким образом, вы можете добавить другие соответствующие соответствия и т. Д., Соответствующие вашей конфигурации.

daveadams
источник
3
Кажется, это лучшее решение.
Вадим
Но Content-Dispositionвзлом в браузере Chromium может начать говорить плохие слова в консоль и даже прекратить загрузку любых файлов со страницы. Там написано худенькие (с желтыми треугольниками) как:"Resource interpreted as Document but transferred with MIME type image/png:"
Накилон
4

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

В нашем сервисе есть следующий каталог для загрузки промоматериала (который включает в себя PDF-файлы, изображения и некоторые документы, но я уверен, что он будет работать и с TXT-файлами):

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

Каждый браузер, который мы пробовали, загружает все файлы из этого места, а не пытается их отобразить.

RVS
источник
4
Использование «add_header» абсолютно неверно, вместо этого используйте «default_type»: location / smth / {default_type application / octet-stream ;; }
Олег Неумывакин
@OlegNeumyvakin Почему default_type лучше, чем add_header?
user193661
2
@ user193661 Поскольку «add_header» буквально добавляет новый заголовок «Content-Type», то в ответ вы можете получить два заголовка «Content-Type», что может привести к странному поведению клиентов HTTP. "default_type" устанавливает (перезаписывает) один заголовок "Content-Type" в ответе.
Олег Неумывакин