好像大部分都对GET方式传参的长度有限制“有所误解”,包括我也是一样。在这次项目开发过程中就遇到了这个问题,好在这个误解解除了!
正如大家在 接口加密方案 一节看到的,加密之后的歌曲地址链接长度足足有572个字符这么长!这个时候我就在想,“不会这个参数GET传到后台之后,部分参数会因为长度限制而被截断吧?”
调查之后,发现是我多虑了!
HTTP 协议从未规定 GET/POST 的请求长度限制是多少
相信大家估计或多或少都听说过这个“传言”(在我不知道之前以为是真理):
HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过XX,而 Post 是无限制的。
但是真实的情况则是:(内容出处来自协议官方文档:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.15)
HTTP itself doesn't impose any hard-coded limit on request length; but browsers have limits ranging on the 2 KB - 8 KB (255 bytes if we count very old browsers).
HTTP 协议并没有规定任何请求参数长度的硬编码限制。但是浏览器自己却对GET提交数据的大小做了限制,(不同的浏览器不完全一样)一般在2KB~8KB之间(如果是非常老版本的浏览器的话是255bytes)
一般来讲,不同浏览器的限制大致如文末总结列表所示,如果超出了最大长度,大部分的服务器直接截断,也有一些服务器会报414错误。
这回明白了吧,我们误传的那个限制,并不是协议本身规定的限制,也不是所有情况下都是请求参数的长度,所谓的请求长度限制是由浏览器和 web 服务器决定和设置的!各种浏览器和 web 服务器的设定均不一样,这依赖于各个浏览器厂家的规定或者可以根据 web 服务器的处理能力来设定。
所以,在我这个调用场景下(不使用浏览器),且Nginx支持这个长度的URI,通过GET来请求完全不用担心。
各浏览器和服务器对URL长度限制
常见浏览器对URL长度限制(可能会随着浏览器版本升级而改变,仅供参考):
- IE浏览器(Microsoft Internet Explorer) 对url长度限制是2083(2K+53),超过这个限制,则自动截断(若是form提交则提交按钮不起作用),对应中文字符的话是2083/9=231个字符
- firefox(火狐浏览器)的url长度限制为 65 536字符,但实际上有效的URL最大长度不少于100,000个字符
- chrome(谷歌)的url长度限制超过8182个字符返回本文开头时列出的错误,对应中文字符长度是8182/9=909个
- Safari的url长度限制至少为 80 000 字符
- Opera 浏览器的url长度限制为190 000 字符。Opera 9 地址栏中输入190 000字符时依然能正常编辑
常见服务器应用对URL长度限制(可能会随着服务器版本升级而改变,仅供参考):
- Apache能接受url长度限制为8 192 字符
- Microsoft Internet Information Server(IIS)能接受url长度限制为16 384个字符
- Perl HTTP::Daemon 至少可以接受url长度限制为8000字符
- Nginx可以通过修改配置来改变url请求串的url长度限制
- client_header_buffer_size 默认值:client_header_buffer_size 1k
- large_client_header_buffers默认值 :large_client_header_buffers 4 4k/8k
以上就是我本次项目过程中遇到并解决了的一个常识性错误问题,你了解并更正误解了吗?
* 本页内容参考以下数据源:
- https://blog.csdn.net/qiushisoftware/article/details/89490267
- https://stackoverflow.com/questions/2659952/maximum-length-of-http-get-request
- https://www.cnblogs.com/cuihongyu3503319/p/5892257.html