Назад | Перейти на главную страницу

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

У меня есть приложение Rails (Redmine), которое работает с Nginx. Если я нажимаю на какое-либо вложение, мой браузер (firefox, то есть Chrome) просит меня загрузить файл. Но если я нажимаю на вложение типа txt, мой браузер откроет этот файл в браузере.

Насколько я понимаю, это задача Nginx - открыть файл в браузере или скачать. Как я могу это настроить?

Изменение Content-Type из .txt файлы могут работать, но это несколько рискованный способ решить эту проблему, потому что вы не можете на 100% гарантировать, что браузер пользователя отреагирует так, как вы ожидаете. Более того, неправильно называть .txt файл как двоичный файл.

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

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

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

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

Тип по умолчанию для расширения txt - text / plain. Это поведение описано в файле 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 чтобы переопределить его (может быть установлено в application / octet-stream).

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

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

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

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