Типы nginx, x-accel-redirect и mime

9

В моей настройке 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блок).

Томас Коля
источник

Ответы:

12

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

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response
Себастьян Эстиенн
источник
1
с tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('Content-Type') в качестве метода .clear устанавливает тип содержимого для text / html
Энтони
1

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

fastcgi_ignore_headers Content-Type;
Мартин Фьордвальд
источник
Спасибо за ваш ответ. Я хочу на сервере разные типы контента, чтобы изображения отображались как изображения, а zip-файлы предлагались для загрузки. К сожалению, это не совсем решает проблему.
Томас Коля
Вы пробовали это или просто предполагаете, что это не сработает? Игнорируя предоставленный внутренним заголовок, он должен попытаться определить его на основе файла.
Мартин Фьордвальд
2
Нельзя игнорировать Content-Type. По wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers возможные значения X-Accel-Redirect, X-Accel-Expires, ExpiresилиCache-Control
jnns
1
«Можно указать заголовки как», в то время как дерьмовое выражение не означает «возможные значения». Ранее я игнорировал Content-Type в сочетании с x-accel-redirect, поэтому я не думаю, что это невозможно, хотя, я признаю, я не знаком с мелкими деталями.
Мартин Фьордвальд,
@MartinFjordvald, попробовал и nginx отказался начать жаловаться, nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27но fastcgi_ignore_headers "Expires"работает
dnozay
0

с php-fpm:

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

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

hanshenrik
источник