http2 error: Invalid HTTP header field was received:
Maxim Dounin
mdounin at mdounin.ru
Tue May 23 16:18:25 UTC 2023
Hello!
On Tue, May 23, 2023 at 02:51:02PM +0000, Johnatan Hallman via nginx wrote:
> Hello List,
>
> I have a setup where I put an ancient host running a perl-cgi
> app behind an nginx reverse proxy.
>
> The http reverse proxy works fine however if I try:
>
> curl -v --anyauth -k https://app.test.lan/cgi-bin/page.pl
>
> I get:
>
> http2 error: Invalid HTTP header field was received: frame type:
> 1, stream: 3, name: [defined(%hash) is deprecated at page.pl
> line 14.], value: []
>
> However if I define http1.1 it works fine:
>
> curl -v --http1.1 --anyauth -k
> https://app.test.lan/cgi-bin/page.pl
>
> I guess all modern browsers default to http2 these days so that
> I can specify it for curl is not a big help. I need this to work
> out of the box.
>
> I have read that Nginx with the listen 443 ssl http2;
> directive will downgrade the connection to http1.1 automatically
> if it's negotiated... otherwise my previous test wouldn't work
> at all.
>
> What I have tried is adding this version directive into the
> location:
>
> location / {
> proxy_pass http://10.9.0.90/;
> proxy_http_version 1.1;
> }
>
> Makes no difference. Any idea how to fix this without touching
> the original app or the original webserver.
It looks like the original app returns an invalid HTTP header (or,
more specifically, returns Perl warnings among the HTTP headers).
This used to work, but with stricter header checking requirements
in HTTP/2 it is rejected by the clients.
Further, nginx itself will reject such invalid upstream responses
starting with nginx 1.21.1, quoting CHANGES:
*) Change: now nginx always returns an error if spaces or control
characters are used in a header name.
That is, with newer nginx version the only option is to actually
fix the upstream server.
With older nginx versions, you may try disabling HTTP/2 (that is,
on the listen socket) as a temporary workaround, this will likely
prevent (at least some) clients from rejecting such invalid
responses. Note though that this is, uhm, a workaround, and
proper solution is to fix the upstream server.
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx
mailing list