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

以下是Nginx 的访问日志:
222.89.55.137 - - [27/Dec/2014:19:35:15 +0800] "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 [info] 20798#0: *9705609 client sent invalid header line: "User-Agent: ^M

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