nginx414Request-URITooLarge
症状
nginx 414 Request-URI Too Large
#客户端请求头缓冲区⼤⼩,如果请求头总长度⼤于⼩于128k,则使⽤此缓冲区,#请求头总长度⼤于128k时使⽤large_client_header_buffers设置的缓存区client_header_buffer_size 128k;
#large_client_header_buffers 指令参数4为个数,128k为⼤⼩,默认是8k。申请4个128k。large_client_header_buffers 4 128k;
当http 的URI太长或者request header过⼤时会报414 Request URI too large或400 bad request错误。
可能原因
场景1.cookie中写⼊的值太⼤造成的,因为header中的其他参数的size⼀般⽐较固定,只有cookie可能被写⼊较⼤的数据场景2.请求参数太长,⽐如发布⼀个⽂章正⽂,⽤urlencode后,使⽤get⽅式传到后台。
GET http://www.2.cn/ HTTP/1.1Host: www.2.cn
Connection: keep-aliveCache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 Accept-Encoding: gzip,deflate,sdchAccept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3Cookie: bdshare_firstime=1363517175366;
If-Modified-Since: Mon, 13 May 2013 13:40:02 GMT
当请求头过⼤时,超过large_client_header_buffer时,nginx可能返回\"Request URI too large\" (414)或者\"Bad-request\"(400)错误。当Request line的长度⼤于large_client_header_buffer的⼀个buffer(128k)时,nginx会返回\"Request URI too large\" (414)错误,对应上⾯的场景2。
请求投中最长的⼀⾏也要⼩于large_client_header_buffer,当不是Request line的最长⾏⼤于⼀个buffer(128k)时,会返回\"Bad-request\"(400)错误,对应上⾯的场景1。
解决办法
这时可以调⼤上述两个值:
client_header_buffer_size 512k;large_client_header_buffers 4 512k;