在项目中遇到了【Nginx】错误 413 Request Entity Too Large 的解决方法该问题,于是引出了本文讨论的问题。
HTTP报文结构如下:
HTTP报文结构包含请求行、请求头、请求体三部分。一次请求示例如下图:
一、请求行【request-line】
POST 请求方法
/sso/login 请求URL,及URI
HTTP/1.1 HTTP协议及版本
HTTP协议没有限制请求行的长度。但是出于各种原因的考虑,各家的浏览器、服务器端都做了不同程度的限制。
1、浏览器限制
所有主流浏览器都会对URI的长度进行限制。如果你在浏览器中输入过长的URI,那么浏览器会自动进行截断。各个浏览器对URI长度的限制各不相同,2000字符以内的URI都能符合所有主流浏览器的要求。
2、服务端限制
一般服务是没有专门针对URI的参数限制的,但是由于URI是会包含在请求头中的,所以对请求头大小的限制是会影响URI的。
3、关于请求行的疑惑
HTTP协议分为request-line、request-header、request-body三个部分的。在查看各浏览器、服务器配置的时候往往将request-line、request-header归为一类了,request-line的数据大小受request-header的影响,比如nginx的large_client_header_buffers属性。
二、请求头【request-header】
请求头部存放了客户端请求的信息,包含User-Agent、Accept、Host等。请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。协议中也没有显示限制请求头的大小。但是出于各种原因的考虑,各家的浏览器、服务器端都做了不同程度的限制。
1、浏览器限制
各主流浏览器都限制请求头的大小,但值得大小不尽相同。
2、服务端限制
出于安全考虑,我们必须在服务器端对请求头大小进行限制,由于存放的信息比较简单,因此建议值不应超过100K。
三、请求体【request-body】
HTTP协议没有限制请求体的长度。HTTP是支持文件传输的,文件的二进制数据不是放在请求行或者请求头里面,它是放在请求体里面的。
1、浏览器限制
如果浏览器对请求体大小做限制,可能会影响文件的传输,因此浏览器本身没有对请求体做大小限制。
2、服务端限制
出于安全考虑,我们必须在服务器端对请求体大小进行限制,请求体长度的最大值的设置有多方面的因素,需要根据业务情况反复调优决定。考虑以下几方面因素:
1、根据请求报文的大小,预估实际请求体的最大值;
2、限制上传文件的大小,文件上传服务与业务操作服务分离;
3、设置合理的超时时间,避免由于请求体太大导致线程被长时间占用;
4、请求体设置不能太大,防止轻易被DDOS攻击;
参考资料
论HTTP请求大小