типи nginx, x-accel-redirect та mime


9

У моїй настройці nginx 0.8.34 я використовую функцію X-Accel-Redirect для управління завантаженнями файлів у коді програми, не маючи при цьому програму обробляти саму завантаження.

Після сильного болю це в основному працює, за винятком того, що nginx завжди повертає файл із text/htmlтипом вмісту.

Типовим типом вмісту є додаток / октет-потік, вказаний у 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", перенаправлення_локації) self.clear_header ("Тип вмісту") як метод .clear задає тип вмісту text / html
Антоній

1

Я особисто лише встановив додаток / октет-потік у програмі, але ви, можливо, зможете використовувати 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 взагалі не надсилати заголовок типу "Вміст" (навіть не порожній), а nginx вгадає тип для вас та додасть заголовок :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.