HTTP分為URI,HEADER,Body三個部分。每個部分都可以包含請求資訊,那麼每個部分是否都有請求大小限制呢?剛開始以為這個問題很容易找到答案,後來發現這也是個挺複雜的問題。
URI
首先是URI,我們知道,在GET請求中,請求參數是放在URL進行傳遞的,是以,HTTP GET的請求最關心的一個問題:能有多長?我能放多少參數?URI
從HTTP 1.1協定中開始找:(RFC 2616)
The HTTP protocol does not place any a priori limit on the length of a URI
是以明确一點的是HTTP協定是沒有顯式限制URI的長度的。理論上來說你在URI中傳遞多少參數都是可以的。
但是現實往往無法永遠照進陽光:
1 浏覽器限制
所有主流浏覽器都會對URI的長度進行限制。如果你在浏覽器中輸入過長的URI,那麼浏覽器會自動進行截斷。各個浏覽器對URI長度的限制各不相同,甚至不同版本也不一樣。大約一個概念,2000字元以内的URI都能符合所有主流浏覽器的要求。
2 服務端限制
即使用戶端同意發送無限長度的URI,但是伺服器一方一般都是有長度限制的。一般服務是沒有專門針對URI的參數限制的,但是由于URI是會包含在request header中的,是以對header的大小限制是會對URI起作用的,比如nginx的(large_client_header_buffers)這個屬性,它預設是4k。
題外話
不管如何,綜上所述,這裡的URI不論是用戶端還是服務端,基本是被預設限制住的。
Header
header中存放的資訊非常多,比如request-line,cookie,還有各種key-value的特定header字段和值。有點時候,我們也會往header中添加一些自定義的屬性。header的長度和URI的情況是一樣的。協定中并沒有顯示限制header的大小。理論上在header中放多少屬性都是可以的。
但是實際上:
各個主流浏覽器限制幾十k~幾百M不等的限制。基本上能滿足平時的需求了。但是如果這個長度對你業務有很大影響的話,建議還是親自測試下。
比如nginx的large_client_header_buffers就限制了header的長度。你也可以自己設定。
可能會影響header的參數還有:
client_header_buffer_size
client_header_timeout
Body
body和URI,header非常不一樣,不一樣的地方原因在于檔案上傳。HTTP是支援request中帶檔案的,那麼檔案的二進制資料不會放在URI或者header裡面,它是放在body裡面的。那麼這個body的大小就一定不能預設限制太小,尤其是用戶端。
首先理論上,協定是沒有對body大小做任何限制的。
其次,浏覽器也沒有對body做任何大小限制,因為如果浏覽器做了大小限制就意味着它直接影響了你的服務功能。
是以對body的限制的任務就放在了伺服器上了。這裡就我最熟悉的nginx+php-fpm來看下有哪些地方可以對body進行限制:
1 nginx有一些設定會對body大小産生影響
client_max_body_size,這個參數可以限制body的大小,預設是1m
client_body_timeout,當body太大,或者網絡太差的時候,這個也有可能會影響請求的成功率的。
2 php.ini也有一些設定會對上傳的body資料産生影響
upload_max_filesize,限制最大上傳檔案大小
post_max_size ,限制post的大小
memory_limit,限制記憶體使用大小
max_execution_time,這個是php最大執行時間,也有可能影響請求成功率的。
HTTP請求大小有什麼影響
首先是安全因素考慮。
試想一下一個網站的伺服器是不限制body大小的,那麼它就是可以被黑客利用攻擊的地方了。黑客利用這一點往HTTP POST的body中傳遞非常大(比如幾M)的請求。那麼比如像nginx+php-fpm這樣的,就會占用了伺服器一個php程序專門處理這個請求,就會導緻你對外無法提供其他的服務了,你的服務就癱瘓了,這就是DDOS攻擊。
其次是檔案上傳服務考慮。
檔案上傳有兩種情況:
你可能經常遇到為什麼檔案上傳失敗?那麼大多是上文說的幾個設定沒有設定對。
其次,檔案上傳大小是不是設定越大越好?答案必須是否定的,理由也是安全考慮。滿足需求的大小限制就夠了。
這裡就可以了解為什麼大都把檔案上傳和業務接口分開來提供了吧。如果你的檔案上傳服務和業務接口是同一個機器的話,那麼就說明你的業務接口可以允許的body大小一定是很大的。換句話說,在這種情境下,你的業務中的所有POST請求都是不安全的!!隻要進行DDOS攻擊,業務就會癱瘓。
,如需轉載請自行聯系原作者