針對get請求,我們可以通過修改兩個配置來解決請求串超長的問題:client_header_buffer_size
語法:client_header_buffer_size size
默認值:1k
使用字段:http, server
這個指令指定客戶端請求的http頭部緩沖區(qū)大小,絕大多數(shù)情況下一個頭部請求的大小不會超過1k,不過如果有來自于wap客戶端的較大的cookie它可能會超過1k,Nginx將分配給它一個更大的緩沖區(qū),這個值可以在 large_client_header_buffers里面設(shè)置。
large_client_header_buffers
語法:large_client_header_buffers number size
默認值:4k/8k
使用字段:http, server
指令指定客戶端請求的一些比較大的頭文件到緩沖區(qū)的最大值,如果一個請求的URI大小超過這個值,服務(wù) 器將返回一個"Request URI too large" (414),同樣,如果一個請求的頭部字段大于這個值,服務(wù)器 將返回"Bad request" (400)。
那么有人就會覺得奇怪了,為什么修改http header的大小就能解決get請求串過長的問題呢, 這就要從http協(xié)議的get請求說起了,其實GET提交,請求的數(shù)據(jù)會附在URL之后(就是把數(shù)據(jù)放置在 HTTP協(xié)議頭中)。
針對POST請求,我們可以調(diào)整如下兩個配置項來解決:client_body_buffer_size
語法:client_body_buffer_size the_size
默認值:8k/16k
使用字段:http, server, location
這個指令可以指定連接請求使用的緩沖區(qū)大小。
如果連接請求超過緩存區(qū)指定的值,那么這些請求或部分請求將嘗試寫入一個臨時文件。
默認值為兩個內(nèi)存分頁大小值,根據(jù)平臺的不同,它可能是8k或16k
client_max_body_size
語法:client_max_body_size size
默認值:client_max_body_size 1m
使用字段:http, server, location
這個指令指定允許客戶端請求的最大的單個文件字節(jié)數(shù),它出現(xiàn)在請求頭部的Content-Length字段。
如果請求大于指定的值,客戶端將收到一個"Request Entity Too Large" (413)錯誤。
需要記住,瀏覽器并不知道怎樣顯示這個錯誤。
同時針對post請求還需要注意下面這個參數(shù)的配置,如果不打開這個選項當請求串大于client_body_buffer_size大小時,需要手動去讀取存儲在磁盤的請求,這里需要注意的是存入磁盤的請求是一個完整的請求并不是大于client_body_buffer_size的部分client_body_in_single_buffer
語法:client_body_in_single_buffer
默認值:off
使用字段:http, server, location這個指令(0.7.58版本)指定將一個完整的連接請求放入緩沖區(qū),當使用$request_body時推薦使用這個指令以減少復制操作。
如果無法將一個請求放入單個緩沖區(qū),將會被放入磁盤。
GET請求的請求參數(shù)最大長度
在HTTP規(guī)范RFC-2616中有這樣一段描述:
The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET- based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15).
Note: Servers ought to be cautious about depending on URI lengths above 255 bytes, because some older client or proxy implementations might not properly support these lengths.
HTTP協(xié)議沒有對傳輸?shù)臄?shù)據(jù)大小進行限制,HTTP協(xié)議規(guī)范也沒有對URI長度進行限制,只是說如果server無法處理太長的URI,可以通過返回414狀態(tài)碼。文章來源:http://www.zghlxwxcb.cn/news/detail-402271.html
規(guī)范中雖然未對GET請求的長度做出明確的規(guī)定,但是在瀏覽器和應(yīng)用服務(wù)器中對GET請求卻做出限制或者相關(guān)的可配置:文章來源地址http://www.zghlxwxcb.cn/news/detail-402271.html
- Chrome:對Google瀏覽器URL的最大長度為8182個字符。
- IE:對IE瀏覽器URL的最大長度為2083個字符。若超出這個數(shù)字,提交按鈕沒有任何反應(yīng)。
- Firefox:對Firefox瀏覽器URL的最大長度為65536個字符。
- Safari: 對Safari瀏覽器URL的最大長度為80000個字符。
- Apache能接受url長度限制為8192字符
- nginx可以通過修改配置來改變url請求串的url長度限制:
client_header_buffer_size 默認值:1k
large_client_header_buffers默認值:4 8k
實驗結(jié)論:
- 瀏覽器的大小一般比Nginx服務(wù)器大,
測試方式:設(shè)置同樣大小的cookie,通過瀏覽器直接訪問服務(wù)器與通過瀏覽器先訪問到Nginx再代理到服務(wù)器做對比得出。
const http = require('http');
const url = require('url')
到了這里,關(guān)于Nginx如何解決超長請求串的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!