типи 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.