关于 HTTP GET/POST 请求参数长度最大值的一个理解误区

2023-11-01

1.    Get方法长度限制

Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。

如:IE对URL长度的限制是2083字节(2K+35)。

下面就是对各种浏览器和服务器的最大处理能力做一些说明.

Microsoft Internet Explorer (Browser)

IE浏览器对URL的最大限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。
Firefox (Browser)

对于Firefox浏览器URL的长度限制为65,536个字符。

Safari (Browser)

URL最大长度限制为 80,000个字符。

Opera (Browser)

URL最大长度限制为190,000个字符。

Google (chrome)

URL最大长度限制为8182个字符。

Apache (Server)

能接受最大url长度为8,192个字符。

Microsoft Internet Information Server(IIS)

能接受最大url的长度为16,384个字符。

通过上面的数据可知,为了让所有的用户都能正常浏览, URL最好不要超过IE的最大长度限制(2083个字符),当然,如果URL不直接提供给用户,而是提供给程序调用,这时的长度就只受Web服务器影响了。

注:对于中文的传递,最终会为urlencode后的编码形式进行传递,如果浏览器的编码为UTF8的话,一个汉字最终编码后的字符长度为9个字符。

因此如果使用的 GET 方法,最大长度等于URL最大长度减去实际路径中的字符数。

2.    POST方法长度限制

理论上讲,POST是没有大小限制的。HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力。

如:在Tomcat下取消POST大小的限制(Tomcat默认2M);

打开tomcat目录下的conf目录,打开server.xml 文件,修改

<connector <="" p="" style="word-wrap: break-word;">

debug="0"

acceptCount="100"

connectionTimeout="20000"

disableUploadTimeout="true"

port="8080"

redirectPort="8443"

enableLookups="false"

minSpareThreads="25"

maxSpareThreads="75"

maxThreads="150"

maxPostSize="0"

URIEncoding="GBK"

增加红色字体部分 maxPostSize="0" (设为0是取消POST的大小限制)





刚看到群里又有同学在说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过

 XX,而 Post 是无限制的,看到这里,我想他们定是看多了一些以讹传讹的博客或者书籍,

导致一种理解上的误区:

1、首先即使有长度限制,也是限制的是整个 URI 长度,而不仅仅是你的参数值数据长度。

2、HTTP 协议从未规定 GET/POST 的请求长度限制是多少。

The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET-based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15). 
 Note: Servers ought to be cautious about depending on URI lengths above 255 bytes, because some older client or proxy implementations might not properly support these lengths.

3、所谓的请求长度限制是由浏览器和 web 服务器决定和设置的,各种浏览器和 web 服务器的设定

均不一样,这依赖于各个浏览器厂家的规定或者可以根据 web 服务器的处理能力来设定。

The limit is in MSIE and Safari about 2KB, in Opera about 4KB and in Firefox about 8KB, (255 bytes if we count very old browsers)  . We may thus assume that 8KB is the maximum possible length and that 2KB is a more affordable length to rely on at the server side and that 255 bytes is the safest length to assume that the entire URL will come in.
If the limit is exceeded in either the browser or the server, most will just truncate the characters outside the limit without any warning. Some servers however may send a HTTP 414 error. If you need to send large data, then better use POST instead of GET. Its limit is much higher, but more dependent on the server used than the client. Usually up to around 2GB is allowed by the average webserver. This is also configureable somewhere in the server settings. The average server will display a server-specific error/exception when the POST limit is exceeded, usually as HTTP 500 error.
HTTP 1.1 defines Status Code 414 Request-URI Too Long for the cases where a server-defined limit is reached. You can see further details on RFC 2616. For the case of client-defined limits, there is no sense on the server returning something, because the server won't receive the request at all.
The server is refusing to service the request because the Request-URI is longer than the server is willing to interpret. This rare condition is only likely to occur when a client has improperly converted a POST request to a GET request with long query information, when the client has descended into a URI "black hole" of redirection (e.g., a redirected URI prefix that points to a suffix of itself), or when the server is under attack by a client attempting to exploit security holes present in some servers using fixed-length buffers for reading or manipulating the Request-URI.


附 GET VS POST:

1、多数浏览器对于POST采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于GET),也就是第一步发送header数据,第二步再发送body部分。HTTP是应用层的协议,而在传输层有些情况TCP会出现两次连结的过程,HTTP协议本身不保存状态信息,一次请求一次响应。对于TCP而言,通信次数越多反而靠性越低,能在一次连结中传输完需要的消息是最可靠的,尽量使用GET请求来减少网络耗时。如果通信时间增加,这段时间客户端与服务器端一直保持连接状态,在服务器侧负载可能会增加,可靠性会下降。

Tips:关于这点你可以参考:Yahoo网站性能优化指南之服务器篇

http://segmentfault.com/a/1190000000353790


http://developer.yahoo.com/performance/rules.html

http://blogread.cn/it/article/6100?f=wb    YSLOW法则中,为什么yahoo推荐用GET代替POST?

上面这篇文章介绍了 wireshark 抓包验证 post 两次发包,get 一次发包的全过程,推荐阅读。



2、GET请求能够被cache,GET请求能够被保存在浏览器的浏览历史里面(密码等重要数据GET提交,别人查看历史记录,就可以直接看到这些私密数据)POST不进行缓存。

3、GET参数是带在URL后面,传统IE中URL的最大可用长度为2048字符,其他浏览器对URL长度限制实现上有所不同。POST请求无长度限制(目前理论上是这样的)。

4、GET提交的数据大小,不同浏览器的限制不同,一般在2k-8K之间,POST提交数据比较大,大小靠服务器的设定值限制,而且某些数据只能用 POST 方法「携带」,比如 file。

5、全部用POST不是十分合理,最好先把请求按功能和场景分下类,对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的2k范围内,这样的情况使用GET。其他地方使用POST。

6、GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「幂等」的,在这一点上,GET 被认为是「安全的」。但实际上 server 端也可以用作资源更新,但是这种用法违反了约定,容易造成 CSRF(跨站请求伪造)。


REF:

maximum length of HTTP GET request?

http://stackoverflow.com/questions/2659952/maximum-length-of-http-get-request  

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.15 Request-URI Too Long

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.1 General Syntax

http://www.cnblogs.com/xiaotaomaomao/articles/986070.html

http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解

post方式相比get安全,携带数据更大,我准备所有数据都用post方式获取,这样好吗?

http://segmentfault.com/q/1010000000213082  

http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html   浅谈CSRF攻击方式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 HTTP GET/POST 请求参数长度最大值的一个理解误区 的相关文章

  • [Vue warn]: Cannot find element: #app

    解决方案 js在html页面头部引入的原因 自定义js文件要最后引入 因为要先有元素id vue才能获取相应的元素
  • JavaScript函数七重关之函数定义

    JavaScript函数七重关的第一关是函数定义 函数定义需要用到function关键字 function myFunction 函数体 document write hello javascrept br 这是函数定义的第一种方法 也可以
  • web前端基础:HTML文字和段落标签

    标题标签 h1 h1 h6 h6 段落标签 p p align对齐属性值 值 描述 left 左对齐 right 右对齐 center 居中对齐 justify 对行进行伸展 每行可以有相等的长度 列表标签 有序列表 ol li 列表项 l
  • Layui富文本编辑器图片上传接口(.NET C#)

    本来想偷懒找个现成的接口 搜了一下发现没有现成的 那我在这写一个并分享给大家吧 demo打包好了在我的csdn下载中心 http download csdn net download xianglikai1 9970000 下面也有代码和结
  • 使用Chrome浏览器自带命令对web页面进行截图,生产高质量图片

    在平时工作中 我们对浏览器的web页面截图有很多方法 无论是Windows还是Mac操作系统 都自带截图工具 但是 如果我们打开的web页面非常的大 我使用操作系统自带的截屏工具就力不从心了 因为我们的显示屏幕不能显示web页面的所有内容
  • Html页面内引入抽取出来的Html,js,css示例

    在写纯Html网站的时候 每个页面的头部菜单 js css和底部说明都是同样的 有的时候你要改 就要一个一个的去改 通过下面方法将这些相同的抽取出来 方便后期维护 希望能帮到你 在applyBusiness html页面引入公共页头head
  • 科技感十足的網站頁面

    http www bootstrapmb com item 9102 preview
  • web前端开发自学书籍推荐这5本

    JavaScript权威指南 第6版 淘宝前端团队翻译的 看译者列表都是一堆大神 这本书又叫犀牛书 号称 Javascript 开发者的圣经 网上对此书评价很多 大概意思都是说这本书是一本 JavaScript 文档手册 没有完整看过一遍此
  • js __proto__、prototype 、constructor 三者关系总结

    一 proto 属性 proto 怎么读 杠杠 proto 杠杠 proto 读作 dunder proto double underscore proto 的缩写 并且它前后两边 分别是 两个 下划线 由 proto 属性来连接对象 直到
  • React 中ref的几种用法

    React 中ref的几种用法 1 字符串 通过 this refs a 来引用真实dom的节点 dom 节点上使用
  • 理解React的虚拟DOM

    一 背景 React是一个用于构建用户界面的JavaScript库 区别于老的前端开发技术 其最核心的就是引入了虚拟DOM的技术 为了对React有一个比较全面和深入的了解 所以把最近学习React虚拟DOM的知识 做个笔记 仅供学习 二
  • ES6语法知识点

    目录 let const 常用 暂时性死区 const 建议 箭头函数 常用 建议 iterator迭代器 解构赋值 常用 建议 剩余 扩展运算符 常用 扩展运算符 剩余运算符 在对象中使用扩展运算符 建议 对象属性 方法简写 常用 对象属
  • 父容器display:flex后,子元素的内部元素height:100%无效解决方法

    父容器display flex后 子元素的内部元素height 100 无效解决方法 解救办法 父类容器position relative 子元素 position absolute width 100 height 100 效果图 代码如
  • vue/cli3添加自定义icon图标

    1 从阿里巴巴矢量图表库将需要的图标 加入购物车 点击购物车 2 选择添加至项目 3 下载到本地 放到项目中 4 在main js中引入iconfont css文件 以实际位置为准 import assets fonts download
  • flex布局宽高度设置不成功

    flex布局中 会出现是在宽高 但是不起作用 那是因为flex布局当不够的时候自动压缩了 可以选择 让其不压缩 flex shrink 0 然后在设置宽高 或者利用复合属性 flex 0 0 83rpx 这篇博客是对flex布局的讲解 以及
  • (一)软件架构概述

    1 系统结构 B S架构 Browser Server 浏览器 服务器的交互形式 Browser支持哪些语言 HTML CSS JavaScript 写HTML CSS JavaScript代码的这波人职位叫做 WEB 前端开发工程师 Ja
  • HTML、CSS、JavaScript分别实现什么功能?

    学习Web前端开发基础技术需要掌握 HTML CSS JavaScript 那么这三个都是分别实现什么功能的呢 下面和小编一起来看看吧 一 HTML是网页内容的载体 内容就是网页制作者放在页面上想要让用户浏览的信息 可以包含文字 图片 视频
  • 理解HTTP headers之Expires、Cache-Control、IF-Modified-Since

    一 什么是Http headers 当你在浏览器地址栏里键入一个url 你的浏览器将会类似如下的http请求 GET tutorials other top 20 mysql best practices HTTP 1 1 Host net
  • 点击按钮复制链接

    做点击按钮复制链接 网上找的方法是用原生js document execCommand Copy window clipboardData setData Text url value 发现微信上存在不兼容 在安卓和PC段都可以 但是在苹果
  • <a>标签的超链接前面会自动加上当前(网站)地址

    当前 网站 地址是 fyh com 在代码里写 a 标签时 会自动在链接前添加 fyh com 例如写如下代码 a href www baidu com baidu a 在浏览器中点击链接会跳转至 fyh com www baidu com

随机推荐

  • (2020)End-to-end Neural Coreference Resolution论文笔记

    2020End to end Neural Coreference Resolution论文笔记 Abstract 1 Introduction 2 Related Work 3 Task 4 Model 4 1 Scoring Archi
  • Android studio中使用ViewPager和BottomNavigationView实现底部导航栏和碎片的同步切换

    前言 通过几次的踩雷和摸索 完成了以上的操作 本教程写的详细全面 包教包会 对新手有好 看了不会的联系我 我倒立洗头给你看 1 需要了解的一些知识 所需控件 fragment 作为Android中最常用的控件 它有自己的声明周期 可以粗略地
  • 静态代码检测工具 cppcheck ubantu下安装及使用教程

    Cppcheck是用在C C 中对code进行静态检查的工具 它的源码在 GitHub danmar cppcheck static analysis of C C code 它的License是GPL 3 0 它可以帮助我们检测出代码存在
  • Qt 插件创建教程

    Qt 插件创建教程 Qt 是一款非常流行的跨平台GUI应用程序开发工具 它提供了丰富的API和工具库 让开发者快速开发出高质量的应用程序 其中 在Qt中 插件是一个非常重要的概念 它可以帮助我们实现模块化编程 可以让我们的应用程序更加灵活
  • Linux内核学习笔记(八)Page Cache与Page回写

    你也可以通过我的独立博客 www huliujia com 获取本篇文章 综述 Page cache是通过将磁盘中的数据缓存到内存中 从而减少磁盘I O操作 从而提高性能 此外 还要确保在page cache中的数据更改时能够被同步到磁盘上
  • 数值分析实验(二)迭代法的应用

    目录 实验名称 数值分析实验 二 迭代法的应用 实验题目 实验原理 1 高斯消去法 2 Jacobi迭代法 3 G S迭代法 4 SOR迭代法 实验数据记录及处理 实验内容及步骤 1 高斯消元法 2 Jacobi迭代法 3 G S迭代法 4
  • 如何使用Python进行桌面应用开发?

    Python提供了多个库和框架来进行桌面应用开发 以下是使用Python进行桌面应用开发的常用方法之一 PyQt PyQt是一个用于开发跨平台桌面应用的Python库 它提供了丰富的GUI组件和工具 以下是使用PyQt创建桌面应用的基本步骤
  • Linux上启用kvm嵌套虚拟化功能

    kvm支持嵌套虚拟化 即可以在虚拟机中创建虚拟机 本文主要介绍如何在使用Intel处理器的CentOS7中开启KVM的嵌套虚拟化功能 kvm主要是通过内核模块来实现的 因此我们查看系统是否开启了kvm嵌套虚拟化 只需要 cat sys mo
  • 代码随想录算法训练营 个人总结

    训练营周期 2023 5 10 7 8 共计60天 LeetCode记录 参加训练营之前 就有想刷LeetCode的想法 一方便没有头绪地不知道按什么顺序刷题 另一方面也没有找到很好的讲解材料 都是自己看LeetCode页面上讨论模块下的高
  • Spark SQL数据源 - 基本操作

    目录 一 基本操作 二 默认数据源 一 默认数据源Parquet 二 案例演示读取Parquet文件 1 在Spark Shell中演示 2 通过Scala程序演示 一 基本操作 Spark SQL提供了两个常用的加载数据和写入数据的方法
  • git上创建自己的仓库并将新项目推上去

    1 在github上创建仓库 创建后复制地址 2 先进入项目文件夹 通过命令 git init 把这个目录变成git可以管理的仓库 git init 3 把文件添加到版本库中 使用命令 git add 添加到暂存区里面去 不要忘记后面的小数
  • 【华为OD机试真题2023B卷 JAVA&JS】找单词

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 找单词 时间限制 1秒 内存限制 32768K 语言限制 不限 题目描述 给一个字符串和一个二维字符数组 如果该字符串存在于该数组中 则按字符串的字符顺序输出字符串每个字符所在单元格的
  • matlab newff函数弃用了,MATLAB神经网络函数NEWFF()新旧用法差异

    摘要 在Matlab R2010a版中 如果要创建一个具有两个隐含层 且神经元数分别为5 3的前向BP网络 使用旧的语法可以这样写 net1 newff minmax P 5 3 1 注意minmax 函数的使用 还有对输出层神经元数 1
  • 论文笔记:用于动态薄膜干涉测量的高光谱成像《Hyperspectral imaging for dynamic thin film interferometry》

    论文地址 Hyperspectral imaging for dynamic thin film interferometry Scientific Reports 目录 论文简介 阻因 现有方法及缺陷 文章贡献 理论依据 实验 实验结果与
  • php curlopt_header,php curl中CURLOPT_HTTPHEADER 这个参数的含义

    php curl中CURLOPT HTTPHEADER 这个参数的含义是 CURLOPT HTTPHEADER 一个用来设置HTTP头字段的数组 Content Type 表示后面的文档属于什么MIME类型 charset表示浏览器可接受的
  • Unity之使UI显示在最上层

    一 原理 Camera Depth 摄像机深度 深度值越小 越浅 越浮于表面 越近 前 Sorting Layer 排序层级 Order In Layer 在排序层中的层级 Render Queue 在Shader中对Tags的Queue进
  • 哗啦啦收银系统配置

    步骤 一 安装哗啦啦收银系统二 安装小票驱动三 创建店铺 进入收银系统 详情请参考我的个人博客 哗啦啦系统后台新增店铺 四 修改打印机模板五 修改打印机名称 准备 小票驱动 安装包 打印模板 功能包 一 安装哗啦啦收银系统 二 安装小票驱动
  • Python IDLE的下载,安装与使用教程

    本次是windows下的IDLE Linux IDLE是没有的 可以直接使用相应的Python 解释器 首先我们现在先进入Python的官网 https www python org 去下载一个Python IDLE程序安装包 找到Down
  • JDBC编码六步走

    JDBC介绍 Java Database Connectivity 简称JDBC 是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口 JDBC的本质 JDBC是SUN公司制定的一套连接数据库的接口 interface 而接口都
  • 关于 HTTP GET/POST 请求参数长度最大值的一个理解误区

    1 Get方法长度限制 Http Get方法提交的数据大小长度并没有限制 HTTP协议规范没有对URL长度进行限制 这个限制是特定的浏览器及服务器对它的限制 如 IE对URL长度的限制是2083字节 2K 35 下面就是对各种浏览器和服务器