HTTP中的URL长度限制

 

首先,其实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 1.1 协议中对url的长度是不受限制的,协议原文: The HTTP protocol does not place any a priori limit on the leng ...

  2. ecshop 资料整理

    ecshop 资料整理   lib_base.php 基础函数库1.sub_str($str, $length = 0, $append = true) 截取UTF-8编码下字符串的函数 string ...

  3. 对word2vec的理解及资料整理

    对word2vec的理解及资料整理 无他,在网上看到好多对word2vec的介绍,当然也有写的比较认真的,但是自己学习过程中还是看了好多才明白,这里按照自己整理梳理一下资料,形成提纲以便学习. 介绍较 ...

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

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

  5. URL长度过长的问题

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

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

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

  7. Nodejs安装使用,以及不错的Nodejs或者JS资料整理

    先按照这个教程来学习:Node.js教程 - 菜鸟教程网 在mac上使用brew安装了nodejs,中间还是用到了先下载到cache目录的方法. 但是后来发现这样按照的node,没有安装npm. 找到 ...

  8. Java资料整理

    Java资料整理 原创 2017年08月25日 17:20:44 14211  1.LocalThread的应用场景,数据传输适合用LocalThread么 2.linux的基本命令    软链接.更 ...

  9. 浏览器和服务器 对post get请求 url长度限制

    1. URL长度限制 2. Post数据的长度限制 3. Cookie的长度限制 1. GET  URL长度限制 在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的, ...

随机推荐

  1. HDU 4798 - Skycity

    告诉你一幢楼的高度,楼的层数,每层一样高. 每一层的底边是一个圆,下一层的玻璃一定要包括进上一层的底边. 每层玻璃铺成棱柱形,玻璃有最小面积限制. 问你这层楼最小的总玻璃数是多少. 求出每层最小的玻璃 ...

  2. Direct2D WIC绘制图片

    绘制图片需要用到WIC,WIC的功能包括: 编解码图片.也可以自定义图片解码插件. 读取图片元数据. 图像处理(最高支持每通道32位). 内置支持一些流行的格式.包括:BMP v5, GIF 89a/ ...

  3. iOS Dev (21) 用 AVPlayer 播放一个本地音频文件

    iOS Dev (21) 用 AVPlayer 播放一个本地音频文件 作者:CSDN 大锐哥 博客:http://blog.csdn.net/prevention 前言 这篇文章与上一篇极其相似,要注 ...

  4. node 通过指令创建一个package.json文件及npm安装package.json

    描述包的文件是package.json文件. 一个这样的文件,里面的信息还是挺大的.我们可以放弃手动建立.为了练手我们有命令行来建一个这样的包; 完成name,varsion....license项的 ...

  5. 纯css改变下拉列表select框的默认样式

    下列CSS就可以解决,原理是将浏览器默认的下拉框样式清除,然后应用上自己的,再附一张向右对齐小箭头的图片即可. select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下* ...

  6. Android Adapter代码片

    /** * Adapter for grid of coupons. */ private static class CouponAdapter extends BaseAdapter { priva ...

  7. HTML5 canvas 在线画笔绘图工具(四)

    HTML5画图命令 图形的绘制是由TDrawHandler与TCommand 协同工作完成. TDrawHandler需要完成以下工作 1.聚集类用于管理绘图的命令 TCommand 2.管理鼠标事件 ...

  8. 【应用】Markdown 在线阅读器

    前言 一款在线的 Markdown 阅读器,主要用来展示 Markdown 内容.支持 HTML 导出,同时可以方便的添加扩展功能.在这个阅读器的基础又做了一款在线 Github Pages 页面生成 ...

  9. Lake Counting--poj2386

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23950   Accepted: 12099 D ...

  10. SQL Server 错误18456

    第一步. 错误发生的场景 第二步. 找到引起错误的原因 第1步. 查看windows日志文件. 运行中输入 eventvwr (event viewer)打开日志文件查看器, 第三步. 解决方案,由第 ...