如何避免Nginx的多重响应

vddsk6oq  于 2024-01-06  发布在  Nginx
关注(0)|答案(1)|浏览(165)

考虑一个类似的HTTP请求:

  1. POST / HTTP/1.1
  2. Host: 127.0.0.1
  3. Connection: keep-alive
  4. Accept: */*
  5. User-Agent: NonExistent Client
  6. Content-Length: 4
  7. foo=bar

字符串
正如你所看到的,请求是无效的,例如。有效载荷长度是7个字节,但CL头只包含4个字节。
Nginx对此请求给出了两个响应:

  1. HTTP/1.1 404 Not Found
  2. Date: Fri, 03 Mar 2023 20:55:02 GMT
  3. Content-Type: text/html
  4. Content-Length: 146
  5. Connection: keep-alive
  6. Vary: Accept-Encoding
  7. X-XSS-Protection: 0
  8. X-Content-Type-Options: nosniff
  9. <html>
  10. <head><title>404 Not Found</title></head>
  11. <body>
  12. <center><h1>404 Not Found</h1></center>
  13. <hr><center>nginx</center>
  14. </body>
  15. </html>
  16. HTTP/1.1 400 Bad Request
  17. Date: Fri, 03 Mar 2023 20:55:02 GMT
  18. Content-Type: text/html
  19. Content-Length: 150
  20. Connection: close
  21. X-XSS-Protection: 0
  22. X-Content-Type-Options: nosniff
  23. <html>
  24. <head><title>400 Bad Request</title></head>
  25. <body>
  26. <center><h1>400 Bad Request</h1></center>
  27. <hr><center>nginx</center>
  28. </body>
  29. </html>


第一个响应包含“正常”404,这是我所期望的。
第二个响应是因为服务器继续处理请求-这是一个完全错误的请求,它给出了400。
服务器写入日志条目:

  1. 2023/03/03 20:55:02 [info] 27273#27273: *8 client sent invalid method while reading client pipelined request line, client: 192.168.72.2, server: _, request: "bar"


这就是为什么我认为它会继续处理分块的请求。
有没有办法避免这种行为,即抑制第二种React?

pzfprimi

pzfprimi1#

防止这种情况的一种方法是在nginx配置中设置keepalive_requests 1;
这将导致它在处理第一个请求后总是挂起,但这可能会对行为良好的客户端的性能产生负面影响。
从理论上讲,似乎可以只为特定的用户代理禁用keep-alive,但this表明nginx不支持这一点。显然,您也不能将keepalive_requests放在if ($http_user_agent ~ NonExistent) {}块中。
除此之外,似乎你最好的办法是修复坏掉的客户端。如果你不能让它发送正确的Content-Length,也许你可以配置它不请求keep-alive

相关问题