Типы 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 угадывает тип для вас и добавляет заголовок :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.