игрорировать некорректные заголовки для upstream

Maxim Dounin mdounin на mdounin.ru
Вт Сен 20 17:40:46 UTC 2022


Hello!

On Tue, Sep 20, 2022 at 07:35:32PM +0300, Igor Savenko wrote:

> Добрый день! Странная ситуация, апстримом для nginx является лайтспид, и
> вот этот лайтспид на http2 отдает нормальные заголовки ответа, а для
> http/1.1 некорректные, например, вот это выводит curl:
> curl -s -v --http1.1 -o /dev/null https://domain.com/images/12345.png
> --resolve domain.com:443:1.2.3.4
> ...
> > GET /images/12345.png HTTP/1.1
> > Host: domain.com
> > User-Agent: curl/7.74.0
> > Accept: */*
> >
> < HTTP/1.1 200 OK
> < Connection: Keep-Alive
> < Keep-Alive: timeout=5, max=100
> expires: Thu, 20 Oct 2022 15:48:24 GMTc
> < content-type: image/png
> < last-modified: Tue, 08 Feb 2022 17:03:26 GMT
> < accept-ranges: bytes
> < content-length: 847
> < date: Tue, 20 Sep 2022 15:48:24 GMT
> < server: LiteSpeed
> 
> Обратите внимание на начало заголовка expires, он не начинается с <
> символа, следовательно, или в начале этого, или в конце предыдущего
> заголовка приезжает некорректный символ. Насколько я знаю, nginx не
> поддерживает http/2 для общения с апстримом. Отсюда вопрос. Есть дешевый
> способ заставить nginx игнорировать некорректные произвольные заголовки
> (полностью заголовок, а не только название) от апстрима, а не только
> заранее определенные, как в директиве proxy_ignore_headers
> <http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers>
>  ?

Судя по выводу curl'а, между предыдущим заголовком и expires 
вместо CRLF или LF стоит просто CR.  В логах nginx'а при этом 
должна быть какая-то такая ошибка:

2022/09/20 12:59:16 [error] 2866#100147: *1 upstream sent invalid header: "X-Foo: foo\x0d..." while reading response header from upstream...

Лечить это надо на бэкенде, подобных вольностей в обращении с 
протоколом nginx не допускает и до какой-либо обработки заголовков 
и/или их игнорирования тут дело не дойдёт, всё сломается при попытке 
парсинга заголовков ответа.

Если в краткосрочной перспективе с бэкендом сделать ничего нельзя, 
то в качестве временного workaround'а можно попробовать 
проксировать по HTTP/2 через grpc_pass.

-- 
Maxim Dounin
http://mdounin.ru/



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