首先,其实http 1.1 协议中对url的长度是不受限制的,协议原文:

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 proxyimplementations might not properly support these lengths.

翻译:

     HTTP协议不对URI的长度作事先的限制,服务器必须能够处理任何他们提供资源的URI,并且应该能够处理无限长度的URIs,这种无效长度的URL可能会在客户端以基于GET方式的请求时产生。如果服务器不能处理太长的URI的时候,服务器应该返回414状态码(此状态码代表Request-URI太长)。

    注:服务器在依赖大于255字节的URI时应谨慎,因为一些旧的客户或代理实现可能不支持这些长度。

具体参见协议 中的3.2.1

虽然协议中未明确对url进行长度限制,但在真正实现中,url的长度还是受到限制的,一是服务器端的限制,二就是游览器端的限制。

一、服务器端

在服务器端,主要是apache,jboss和nginx等,我在网上找到的调节方法可以参加下文:关于http请求url长度以及请求消息体长度的研究(一)(服务器端)

1.1 nginx

由于现在项目中主要用到nginx,所以强调下它的设置参数:large_client_header_buffers

该参数对nginx服务器接受客户端请求的头信息时所分配的最大缓冲区的大小做了限制,也就是nginx服务器一次接受一个客户端请求可就收的最大头信息大小。这个头不仅包含 request-line,还包括通用信息头、请求头域、响应头域的长度总和。这也相当程度的限制了url的长度。

nginx服务器默认的限制是4K或者8K,这是根据服务器的硬件配置有关的,一般为内存一页的大小,目前大部分为4K,即4096字节。

二、游览器端

游览器的种类繁多,并且对URL的长度限制是有所差异的,具体如下:

游览器 最大长度(字符数)           备注
 Internet Explorer   2083      如果超过这个数字,提交按钮没有任何反应
 Firefox 65,536  
 chrome 8182  
 Safari  80,000  
 Opera 190,000  
curl(linux下指令) 8167  

这些数据主要通过网上数据搜索而来,笔者还没有亲自验证过。但都有限制是不争的事实,大家在做开发时要特别注意。

我首先想到的就是去看HTTP 1.1 协议,看是不是有限制(这协议真是又臭又长.......)。惊奇的发现,原来协议对url是不做长度限制的。原话如下:

"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."

HTTP协议不对URI的长度作事先的限制,服务器必须能够处理任何他们提供资源的URI,并且应该能够处理无限长度的URIs,这种无效长度的URL可能会在客户端以基于GET方式的请求时产生。如果服务器不能处理太长的URI的时候,服务器应该返回414状态码(此状态码代表Request-URI太长)。

注:服务器在依赖大于255字节的URI时应谨慎,因为一些旧的客户或代理实现可能不支持这些长度。

所以从http标准协议上讲没有对url长度进行控制,header头长度是否有限制有待进一步研究协议。对url以及header长度的限制主要取决于服务器以及客户端的限制。

然后先从服务器端入手:

主要看了apache和nginx两种服务器,其他的咱也不熟

在apache的官方文档上找到这样一个配置选项 LimitRequestLine


 (http://httpd.apache.org/docs/2.0/mod/core.html#limitrequestline

从定义来看,这个选项限制的并不是url的长度,也不是head头的长度,而是是http请求中 request-line的长度(相关定义:http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1)。

即:Request-Line = Method SP Request-URI SP HTTP-Version CRLF 的长度。

但这很大程度上也就限制的GET、HEAD请求的参数长度,因为GET和HEAD请求是不会向服务器发送消息实体(message-body)的。可以说这个限制就是限制了url的长度不能超过该设定的值,如果超过了,服务器会返回错误状态码 414(Request-URI Too Large)。

那么对于整个消息体,apache服务器有限制吗?

接下来我有看了其他相关的参数,果然有 :LimitRequestBody


http://httpd.apache.org/docs/2.0/mod/core.html#limitrequestbody

这个参数限制了http请求可以被接受的最大消息大小,默认是无限大的,但是其实这个无限也是有限的,最大不能超过2G。

这就是apache服务器对http请求的相关的一些限制

对于nginx服务器,也有类似的参数

large_client_header_buffers

该参数对nginx服务器接受客户端请求的头信息时所分配的最大缓冲区的大小做了限制,也就是nginx服务器一次接受一个客户端请求可就收的最大都信息大小。这个头不仅包含 request-line,还包括通用信息头、请求头域、响应头域的长度总和。这也相当程度的限制了url的长度。

nginx服务器默认的限制是4K或者8K,这是根据服务器的硬件配置有关的,一般为内存一页的大小,目前大部分为4K,即4096字节。

client_header_buffer_size


http://wiki.nginx.org/HttpCoreModule#client_header_buffer_size

该参数对发自客户端的http头信息的大小进行了限制,这个值和large_client_header_buffers同时限制了http请求头的大小,超过其中一个值则服务器会返回错误状态码 414(Request-URI Too Large)。

该参数的默认值为1K

client_max_body_size

该参数对发自客户端的http请求的消息实体大小进行了限制,如果超过该值,则会服务器会返回错误状态码 413(Request Entity Too Large)。此参数默认值为1MB,相当于是限制了post方式提交内容的最大限制

以上便是服务器端对http请求url长度以及请求消息体长度的相关限制,这些我都只是根据其官方文档得出的结果,没有经过实际测试

HTTP中的URL长度限制的更多相关文章

  1. HTTP中的URL长度限制(资料整理)

    HTTP中的URL长度限制   首先,其实http 1.1 协议中对url的长度是不受限制的,协议原文: The HTTP protocol does not place any a priori l ...

  2. ASP.NET MVC, Url长度过长问题解决,404.15问题

    最近在处理一个问题的时候,发现他们存在一个大量数据放在URL中传递的过程,当数据达到一定数量的时候就会报出404.15问题. 运行环境是在IIS8,经过查询之后发现,URL此时最大长度为2048,肯定 ...

  3. 浏览器和服务器 对http请求(post get) url长度限制

    1. GET  URL长度限制 在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的,HTTP协议并不对URI的长度做任何的限制,服务器端 必须能够处理任何它们所提供服 ...

  4. 从浏览器中输入URL到页面加载的发生了什么-转载

    转:https://www.cnblogs.com/confach/p/10050013.html 背景 “从浏览器中输入URL到页面加载的发生了什么“,这是一道经典的面试题,涉及到的知识面非常多,但 ...

  5. URL长度过长的问题

    最近项目中很多跨域的问题,有时候跨域要传递很多参数,甚至有时候要传递整个对象,处理的方法是把对象转换成JSON形式的字符串再传递.此时该JSON字符串就比较长,作为参数附加到URL后面,URL就会变得 ...

  6. 使用隐藏form表单下载文件,解决url方式下载,由于环境问题而限制url长度,满足不了所有的需求!

    一 对于某些环境导出是直接用wiondow.href=url直接导出下载,有些业务需求,如员工档案等字段比较多的时候,全选导出就会引发异常,由于Nginx转发长度限制的问题, 如果运维不愿意改变环境, ...

  7. 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1

    [ASP.NET Core]EF Core - “影子属性”   有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...

  8. Loadrunner如何遍历一个页面中的url并进行访问?

    最近在网上到一个关于loadrunner遍历一个页面中的url并进行访问的脚本,就把它用我们自己的项目实践了一下,发现有一点不完善. 原始版本: Action(){char temp[64];int ...

  9. url长度

    今天在测试Email Ticket的时候发现在进行Mark as Read/Unread操作时,请求是通过GET方式进行的.URL中列出了所有参与该操作的Ticket Id.于是,我想起GET请求是有 ...

随机推荐

  1. RelativeSource设定绑定方向

    <Window x:Class="Yingbao.Chapter2.RelativeEx.AppWin" xmlns="http://schemas.microso ...

  2. 3122 奶牛代理商 VIII(状压dp)

    3122 奶牛代理商 VIII  时间限制: 3 s  空间限制: 256000 KB  题目等级 : 大师 Master     题目描述 Description 小徐是USACO中国区的奶牛代理商 ...

  3. 雷哥带你走进Javascript

    javascript复习笔记--------------------------------------------1.概念2.面向对象思想3.作用认识4.引入方式5.执行顺序 变量 1)声明方式 x ...

  4. redux使用过程中遇到的两个致命的关键点

    一.在reducer中,返回的state必须是全新的对象,否则,redux不会执行listening方法,因为redux会认为state没有更新过,没必要重新渲染view. 出现问题的例子: cons ...

  5. python 网络编程(socketserver,阻塞,其他方法)

    重点回顾: (重点)粘包 : 就是因为接收端不知道如何接收数据,造成接收数据的混乱的问题 只发生在tcp协议上. 因为tcp协议的特点是面向数据流形式的传输 粘包的发生主要是因为tcp协议有两个机制: ...

  6. bzoj1367 可并堆

    题面 参考:<左偏树的特点及运用--黄河源> 我们将这个数列划为很多个互不相交的区间,每一段区间内的 \(b\) 是相等的,即 \(b[l[i]]=b[l[i]+1]=...=b[r[i] ...

  7. Tensorflow编程基础之Mnist手写识别实验+关于cross_entropy的理解

    好久没有静下心来写点东西了,最近好像又回到了高中时候的状态,休息不好,无法全心学习,恶性循环,现在终于调整的好一点了,听着纯音乐突然非常伤感,那些曾经快乐的大学时光啊,突然又慢慢的一下子出现在了眼前, ...

  8. C++STL——堆栈

    一.相关定义 原理:stack队列是一个线性存储表,插入和删除只在栈顶进行,从而构成了一个后进先出LIFO表. 入栈&出栈:元素的插入称为入栈,元素的删除称为出栈. stack是一种关联容器, ...

  9. spring-data-jpa 简单使用心得

    对于总是使用mybatis的我,突发奇想的想使用spring-data-jpa搭一个小环境,这几天处处碰壁,现总结如下: 环境采用springboot maven需要导入: <dependenc ...

  10. Spring和SpringMVC配置中父子WebApplicationContext的关系

    一.前言 有这么一个故事:一辆装满石头的板车,一根绳子系着,起初绳子没有拉直,拉绳的人以为很轻,等真的绷直了才发现自己的力气根本不够~人往往喜欢得过且过,但是有些东西真的是绕不过的,所以现在必须努力的 ...