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

nginx, x-Accel-Redirect и типы MIME

В моей настройке nginx 0.8.34 я использую функцию X-Accel-Redirect для управления загрузкой файлов в коде приложения, при этом приложение не обрабатывает загрузку.

После долгой боли это теперь в основном работает, за исключением того, что nginx всегда возвращает файл с text/html Тип содержимого.

Тип содержимого по умолчанию - application / octet-stream, указанный в http блок.

Блок сервера содержит, среди прочего, определение каталога, в котором хранятся файлы:

location /files {
  default_type  application/octet-stream;
  alias /srv/www/uploads;
  internal;  
}

Итак, я указал тип контента даже здесь, но ничего не изменилось.

Я не хочу устанавливать Content-Type приложением, потому что тогда я бы замедлил работу (сначала мне нужно было бы определить это). Поэтому в идеале nginx должен возвращать правильный mimetype на основе расширения файла (я включаю mime.types в http блок).

Если вы хотите, чтобы nginx угадывал правильный тип MIME, вы должны убедиться, что ваш внутренний сервер не возвращает тип контента.

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response

Я лично просто установил application / octet-stream в приложении, но вы мощь уметь использовать fastcgi_ignore_headers чтобы предотвратить использование Nginx заголовка, предоставленного сервером.

fastcgi_ignore_headers Content-Type;

с php-fpm:

<?php
    header("Content-Type: ");
    header("X-accel-redirect: (...)");

сообщает php, чтобы он вообще не отправлял заголовок Content-Type (даже не пустой), а nginx угадает тип и добавит заголовок :)