當 IIS7/7.5 收到的請求頭的長度超過16K(默認值),就會引發"Bad Request - Request Too Long. HTTP Error 400. The size of the request headers is too long."的錯誤。
博客園服務器曾遭遇過這個問題,我為此寫過一篇博文(cnzz統計代碼引起的Bad Request - Request Too Long),問題的原因是第三方統計服務cnzz的統計代碼寫入大量的cookie,請求時會攜帶著這些cookie,從而造成請求頭長度超過限制。
本來以為這個問題只在Chrome中出現,后來有園友反饋Firefox也會出現這個問題。所以,要解決這個問題,必須從服務器端下手,這篇文章分享的就是如何從服務器端下手。
何處下手
根據IIS官方論壇的帖子(HTTP 400. The size of the request headers is too long),16K的請求頭/請求長度限制由是注冊表(HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/HTTP/Parameters)中的兩個參數 MaxFieldLength(請求頭) 與 MaxRequestBytes(請求頭與請求體) 決定的。所以,要從這兩個參數下手。
了解下手的對象
通過微軟官方文檔(http://support.microsoft.com/kb/820129)進一步了解MaxRequestBytes與MaxFieldLength:
MaxFieldLength - Sets an upper limit for each header.
用于設置每一個請求頭的字節數上限(默認16K)。
MaxRequestBytes - Determines the upper limit for the total size of the Request line and the headers.
用于設置請求行(請求體)與請求頭的總字節數上限(默認16K)。
如何下手
下手也就是調整 MaxFieldLength 與 MaxRequestBytes 的值(這里假設將這兩個值修改為32K),并使其生效。
運行regedit,進入 HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/HTTP/Parameters ,
1. 添加類型為 DWORD(32-bit)、名為 MaxFieldLength、值為十進制32768的項目;
2. 添加類型為 DWORD(32-bit)、名為 MaxRequestBytes、值為十進制32768的項目。
添加好了,如何讓它們生效呢?最簡單的方法就是重啟,可是對于服務器,最不想做的就是重啟。
還好,微軟官方文檔中提到了不重啟的解決方法,需要運行四個命令:
代碼如下:
net stop http
net start http
net stop iisadmin /y
net start servicename
但是第3個命令 net stop iisadmin 會停用IIS相關的所有服務,第4個命令要將IIS相關的所有服務一個一個啟動。
雖然不需要重啟服務器,但是這四個命令的解決方案我不喜歡。。。在網上也沒找到更好的解決方法。。。
后來,通過摸索,找到了一個更簡單的方法,只需三個命令:
代碼如下:
net stop http
net start http
iisreset
這個方法已經在服務器上通過實際驗證。
小結
新聞熱點
疑難解答