Nginx开启http2协议反向代理时期望在用户使用http11协议请求时能够为用户返回正确的chunked 编码的数据或者带有content-length响应的正确长度的响应数据请问如何解决
要解决这个问题,可以使用Nginx的map指令来检测请求的协议版本,并根据需要设置相应的响应头。
首先,在Nginx的配置文件中,添加一个map块来检测请求的协议版本:
map $http2 $http_version {
default $http_version;
'' $server_protocol;
}
然后,在反向代理的配置中,根据检测到的协议版本设置响应头。例如,如果请求使用HTTP/1.1协议,可以使用add_header指令设置Content-Length响应头,如果请求使用HTTP/2协议,则不需要设置Content-Length。
location / {
proxy_pass http://backend;
if ($http_version = "HTTP/1.1") {
add_header Content-Length $upstream_http_content_length;
}
}
在上述配置中,$upstream_http_content_length变量表示后端服务器返回的响应头中的Content-Length值。
请注意,使用if指令可能会对性能产生一些负面影响。如果可能的话,建议使用map指令来检测协议版本,并在add_header指令中使用变量来设置响应头。
另外,还要确保后端服务器正确设置了Content-Length或者使用了chunked编码来发送响应数据。这样,Nginx才能正确地将这些信息传递给客户端。
原文地址: https://www.cveoy.top/t/topic/i4St 著作权归作者所有。请勿转载和采集!