henda 发表于 2018-11-8 11:10:50

Nginx 400错误研究

这几天游戏上线在查看 Nginx 的访问日志时,发现有很多 HTTP 返回码为 400 的记录。  

  
以下是Nginx 的访问日志:
  
222.89.55.137 - - "POST /dia.php HTTP/1.1" 400 172 "-" "-" "-"
  

  
网站查了很多文档关于400问题的解决方法:
  

  
1.修改nginx配置文件
  
client_header_buffer_size 128k;
  

  
large_client_header_buffers 4 128k;
  

  
按照这个方法实验了,错误依旧问题依然没有解决。
  

  
2.增加default配置文件
  
增加默认的server到配置文件,以下配置的解释看这里禁止未绑定域名访问
  
代码如下 复制代码
  
server {
  
   listen 80 (www.111cn.net)default_server;
  
   server_name _;
  
   return 404;
  
   access_log off;
  
}
  

  
from:http://www.111cn.net/sys/nginx/52851.htm
  

  
这种方法也测试了也没能解决。
  
于是查看RFC文档:
  

  
A client MUST include a Host header field in all HTTP/1.1 request messages . If the requested URI does not include an Internet host name for the service being requested, then the Host header field MUST be given with an empty value. An HTTP/1.1 proxy MUST ensure that any request message it forwards does contain an appropriate Host header field that identifies the service being requested by the proxy. All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request) status code to any HTTP/1.1 request message which lacks a Host header field.
  
上面是http1.1的rfc关于host部分的解释,
  
从上面我们了解到如果一个http1.1的请求没有host域,
  
那么server应该给client段发送400的状态码,
  
表明这个请求server不能处理。而对于nginx server来说,
  
也遵循这样的方式,说明client发送了一个无效的请求,
  
nginx server无法处理,故返回400的状态码。
  

  

  
根据上面的描述分析判断是客户端请求的http header 是不可用造成的
  

  

  
于是继续google
  

  
把Nginx的错误日志的级别调到info级别来证明自己的判断,结果真有收获,
  
以下信息是Nginx errorlog中的内容:
  
2014/12/27 19:35:11 20798#0: *9705609 client sent invalid header line: "User-Agent: ^M
  

  
根据以上的错误信息判断是客户端发过来的header 是错误的导致nginx返回400错误,
  
至于为什么客户端会发送错误的header 信息,我也只能让开发来看了。


页: [1]
查看完整版本: Nginx 400错误研究