nginx反向代理配置 + POST请求携带content导致的异常

编程知识 更新时间:2023-04-05 06:32:46

在使用 nginx反向代理功能时,因为我们只对客户端请求中的请求行感兴趣,对请求头和包体数据不感兴趣,所以忽略了请求头和请求包体数据(proxy_pass_request_headers proxy_pass_request_body全部off)。但是在客户端请求是 POST并且携带 content内容时,nginx反向代理发给后端请求数据中就会携带 Content-Length字段,可能会导致异常发生。

之前理解是 proxy_pass_request_headers设置 off后,客户端所有请求头全部不发送给后端服务器,但是 Content-Length好像是在 原始请求和子请求中共享,所以带给了子请求,具体还需要看 nginx源码。

 

例子:

使用nginx版本1.14.2,在使用反向代理时,如果配置文件如下:

http {
    upstream upstream_test_backend {
        server 192.168.240.141:6311;
        keepalive 10240;
    }

    server {
        listen       8686;
        location /upstream_test {
            proxy_pass http://upstream_test_backend;
            proxy_http_version 1.1;
            proxy_pass_request_headers off;
            proxy_pass_request_body off;
            proxy_set_header Connection "";
        }
}

客户端请求命令:

curl -d"1" -XPOST 127.0.0.1:8686/upstream_test

在客户端请求是 POST并且带有 content内容时,nginx转发给后端的请求头中会携带 Content-Length头,但是因为 proxy_pass_request_body off所以不携带包体数据。这会导致有些 HTTP服务器一直等待 content内容(Content-Length不为0),因此和后端通信超时,请求不能正常处理。请求 HTTP数据如下:

 

把 nginx location里的配置手动设置 Content-Length为空,请求后端服务器就不会有 Content-Length头部了,配置请求如下

http {
    # ...

    server {
        listen       8686;
        location /upstream_test {
            proxy_pass http://upstream_test_backend;
            proxy_http_version 1.1;
            proxy_pass_request_headers off;
            proxy_pass_request_body off;
            proxy_set_header Connection "";
            proxy_set_header Content-Length "";	
       }
}

HTTP请求如下:

 

更多推荐

nginx反向代理配置 + POST请求携带content导致的异常

本文发布于:2023-04-05 06:32:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/0b2481238f52e472b2e787320112ad33.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:异常   nginx   POST   content

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 45296文章数
  • 14阅读数
  • 0评论数