症狀
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.264.cn/ HTTP/1.1 Host: www.264.cn Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 Accept-Encoding: gzip,deflate,sdch Accept-Language: zh-CN,zh;q=0.8 Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3 Cookie: 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)錯誤。
如上例HTTP請求頭由多行構成,其中"GET http://www.264.cn/ HTTP/1.1"表示Request line
當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;