В моей настройке 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 угадает тип и добавит заголовок :)