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

6 篇文章 0 订阅
2 篇文章 0 订阅

在使用 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请求如下:

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值