[IIS]修改MaxFieldLength與MaxRequestBytes徹底解決Request Too Long的問題


當 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

這個方法已經在服務器上通過實際驗證。

小結

搞技術的樂趣之一就是在遇到問題時能夠找到自己心目中想要的解決方法,心目中想要的解決方法不是它已在你心中,而是當它出來時,你心中會知道 —— 就是它!

生活中也是一樣,你心目中的那個人,你無法准確地描述出來,當她/他出現時,你心中會知道 —— 就是她/他。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM