1. Get請求攜帶數據量的各種限制及解決辦法
Http Get方法提交的數據大小長度並沒有限制,HTTP協議規范沒有對URL長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制。
到新公司處理的第一個線上問題是某個商品頁,在某個人機器上訪問失敗,nginx返回400錯誤,但其它人機器上沒有問題,即使用虛擬機重建了出問題機器的軟硬件環境也不會出問題。
經過對出問題機器的http請求進行抓包,發現URL超長,cookie也很大,然后問題就很清楚了,因為大部分人用的是IE瀏覽器,IE瀏覽器限 制了URL長度,做了自動截斷處理,所以總的http header不會超出nginx的限制,可以正常返回,而使用同樣瀏覽器,不限制URL長度,但cookie長度較短,沒超過nginx的header緩 沖區限制,也不會造成400錯誤。
解決辦法就是修改nginx、tomcat等使用到的應用服務器,讓他們支持更大的header緩沖區。當然從兼容性等方面的考慮,根本解決辦法是不要通過GET方式傳遞超長的參數。
==================下邊列出了各個瀏覽器的限制和處理辦法=========================
附:各瀏覽器對URL的長度限制(單位:字符個數)
IE : 2083
Firefox:65536
Chrome:8182
Safari:80000
Opera:190000
附:各Web服務器對URL的長度限制(單位:字符個數)
Apache (Server)
能接受最大url長度為8,192個字符。
Microsoft Internet Information Server(IIS)
能接受最大url的長度為16,384個字符。
通過上面的數據可知,為了讓所有的用戶都能正常瀏覽, URL最好不要超過IE的最大長度限制(2083個字符),當然,如果URL不直接提供給用戶,而是提供給程序調用,這時的長度就只受Web服務器影響了。
注:對於中文的傳遞,最終會為urlencode后的編碼形式進行傳遞,如果瀏覽器的編碼為UTF8的話,一個漢字最終編碼后的字符長度為9個字符。
因此如果使用的 GET 方法,最大長度等於URL最大長度減去實際路徑中的字符數。
附:各瀏覽器允許域下的最大cookie數目
IE :原先為20個,后來升級為50個
Firefox: 50個
Opera:30個
Chrome:180個
Safari:無限制
附:瀏覽器所允許的每個Cookie的最大長度
Firefox和Safari:4079字節
Opera:4096字節
IE:4095字節
附:各應用服務器設置header頭部的參數
<Connector port="8080" maxHttpHeaderSize="65536"
2. POST請求長度限制
理論上講,POST是沒有大小限制的。HTTP協議規范也沒有進行大小限制,起限制作用的是服務器的處理程序的處理能力。
如:在Tomcat下取消POST大小的限制(Tomcat默認2M);
打開tomcat目錄下的conf目錄,打開server.xml 文件,修改
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="8080"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="GBK"
>
</Connector>
增加紅色字體部分 maxPostSize="0" (設為0是取消POST的大小限制)