对GET传参长度限制的误解

* 本页面总结凯冰音乐APP项目对GET传参长度限制的误解的相关内容。

好像大部分都对GET方式传参的长度有限制“有所误解”,包括我也是一样。在这次项目开发过程中就遇到了这个问题,好在这个误解解除了!

后台Nginx日志截图
后台Nginx日志截图

正如大家在 接口加密方案 一节看到的,加密之后的歌曲地址链接长度足足有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

凯冰科技 · 代码改变世界,技术改变生活
下一篇:歌词如何获取? →