Типы 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;