这几天游戏上线在查看 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 信息,我也只能让开发来看了。