Типы 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 блок).

2 ответа

Решение

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

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

С php-fpm:

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

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

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

fastcgi_ignore_headers Content-Type;
Другие вопросы по тегам