Re: Теперь нельзя выставлять тип контента!

Maxim Dounin mdounin at mdounin.ru
Sat Sep 21 23:12:33 UTC 2013


Hello!

On Sat, Sep 21, 2013 at 01:40:04PM -0400, nickolay wrote:

> Здравствуйте,
> 
> Обновили nginx до версии 1.5.5 и perl-скрипты перестали отдавать файлы, в
> лог выпадает следующее:
> "header already sent while reading response header from upstream"
> 
> Нашёл, что всему виной вот этот коммит:
> http://hg.nginx.org/nginx/rev/03ff14058272
> Он проверяет, если заголовок уже отправлялся, то это ошибка.

И это правильно.  Если заголовок пытаются отправить дважды - то 
это может привести к непредсказуемым последствиям, лучшее из 
которых - битый ответ.

> Но как быть? Нам перед тем как сделать внутренний редирект обязательно нужно
> установить MIME-тип, так как редирект будет на файл без расширения, и если
> не установить явно тип контента, то nginx сам установит
> application/octet-stream.
> 
> Устанавливаем из скрипта тип контента таким образом:
> $r->send_http_header("$mime")
> 
> Если убрать эту строку, то всё работает, но отдаётся с
> application/octet-stream.

Простейшее решение - отдавать файл perl'ом же, для этого есть 
специальный метод $r->sendfile().

http://nginx.org/ru/docs/http/ngx_http_perl_module.html#methods

-- 
Maxim Dounin
http://nginx.org/en/donation.html



Подробная информация о списке рассылки nginx-ru