Назад | Перейти на главную страницу

Заголовок размещения контента на Nginx

Я выполняю настройку, в которой Apache запускает веб-приложение, а NginX обслуживает файлы, загружаемые пользователями. Файлы следует загружать с их настоящими именами, а не с именами, под которыми они хранятся. Настоящие имена извлекаются из базы данных. Я не понимаю, почему я не могу заставить NginX загружать файлы с их настоящими именами. Я отправляю следующие заголовки на php из Apache в NginX:

header('Location: ' . "http://nginx.mysite.com:8080/" . $file['upload_id']);
header('Content-type: ' . $this->mime);
header('Content-Disposition: attachment; filename="' . $file['file_name'] . '"');
header('Last-Modified: ' . date('D, d M Y H:i:s \G\M\T' , $this->data_mod));

Похоже, что NginX игнорирует заголовок Content-Disposition? Или у меня не получается синтаксис?

Изменить: вывод

curl --head http://…/your/file.ext

как следует:

HTTP/1.1 200 OK
Server: nginx/1.0.5
Date: Sat, 16 Feb 2013 14:26:33 GMT
Content-Type: application/octet-stream
Content-Length: 38807550
Last-Modified: Sun, 06 Jan 2013 14:37:36 GMT
Connection: keep-alive
Accept-Ranges: bytes

nginx не узнает, что ему нужно вернуть заголовок только потому, что заголовок был возвращен из Apache. Запрос к Apache будет возвращать этот заголовок, но вы также говорите клиенту, что он должен получить этот файл из nginx, и nginx не получит этот заголовок и не узнает, чтобы отправить его обратно, если у вас нет чего-то в nginx конфигурация для этого.

Вот как это сейчас работает (... представляет другие заголовки, не важные для этого обсуждения):

Запрос к Apache

GET /your/file.ext HTTP/1.1
Host: apache.mysite.com
...

Ответ от Apache

HTTP/1.1 302 Redirect
Location: http://nginx.mysite.com:8080/fileid
Content-Disposition: attachment; filename="filename"
...

Когда ваш веб-клиент получает это, в основном ему предлагается пойти куда-нибудь еще. Это инициирует новый запрос:

Запрос к nginx

GET /fileid HTTP/1.1
Host: nginx.mysite.com
...

Ответ от nginx

HTTP/1.1 200 OK
... (no Content-Disposition header)

Вам нужно, чтобы ответ nginx возвращал Content-Disposition заголовок, а не ответ Apache / PHP. Здесь у вас есть несколько вариантов:

  • Передайте запрос nginx скрипту, который переведет fileid форма для file.ext форма, отправьте обратно Content-Dispotion: заголовок и вернуть данные (это очень похоже на ваш сценарий PHP, за исключением того, что он также должен возвращать данные файла).
  • Запросить file.ext форму из nginx и настройте nginx, чтобы всегда добавлять Content-Disposition: заголовок с filename= часть установить file.ext запроса.
  • Обновите свой PHP-скрипт для внутреннего прокси-запроса nginx, чтобы вместо возврата Location: заголовок и последующее перенаправление, он возвращает нужный заголовок, затем извлекает данные из nginx внутри и выгружает их клиенту.

Второй вариант кажется самый чистый мне, но ваша установка может не поддерживать это.