文档章节

HTTP中的URL长度限制

谢思华
 谢思华
发布于 2015/11/09 18:11
字数 926
阅读 1537
收藏 8

由于之前的一个web项目中,要用get方法去获取数据,但结果时常报错,经过仔细排查才发现原来url长度超过了限制,通过缩短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字节。

     

    1.2 nodejs

     这主要是针对nodejs程序员,如不做相关开发可以直接忽略这一节。

     nodejs的http服务,设置url长度限制和headers的大小还是相对比较灵活的,我简单实现了控制程序,这里_limit就是url长度的控制器

var http = require('http');
var _limit = 40;
var app = http.createServer(function(req,res){
  console.log('hello world');
  var potocol = 'http:\/\/';
  var host = req.headers.host;
  var url = req.url;
  
  var code = 200;
  var allurl  = potocol + host + url;
  console.log(allurl);
  var len = allurl.length;
  if(len > _limit){
    var code = 414;
    res.writeHead(code, {});
    res.end();
  }
  else{
    var body = {'name':'jifeng'};
    res.writeHead(code, {});
    res.end(JSON.stringify(body));
  }
});
app.listen(1987,function(){
  console.log('server listen on 1987');  
});

备注: connect中的limit中有实现相类似功能的模块,
     

 

     二、游览器端

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

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

本文转载自:http://www.cnblogs.com/lengyuhong/archive/2012/02/04/2330130.html

谢思华
粉丝 77
博文 221
码字总数 152858
作品 0
广州
程序员
私信 提问
HTTP协议对URI长度,POST数据长度及COOKIE长度限制说明

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

张小农
2015/03/29
4.2K
1
从 HTTP/1.1 协议文档看 GET 和 POST 的区别

"标准"答案 GET使用URL或Cookie传参,POST则将数据放在body中 GET的URL会有长度上的限制,POST的数据可以非常大 POST比GET安全,因为数据在地址栏上不可见 这都是一些经典面试材料抄袭的"经典...

JavaEdge
01/03
0
0
IOS http请求的get 和 post的请求的区别

从表面的意思看get 和 post的区别get就是获取数据,post就是发送数据。这个是误区。其实两者都可以的,在IOS向服务器发送请求里面可以带参数。 那么这些误区是怎么出现的呢?先看看一下对htt...

人魔七七
2012/09/03
0
0
GET与POST传递数据的最大长度能够达到多少

各种web开发语言中,各个页面之间基本都会进行数据的传递,web开发里面比较常用的数据传递方式有get post,一直以来我都只知道get传递的数据量要比post传递的数据量要少,所以传递大数据量还...

微信迷
2014/02/27
1K
0
GET和POST到底啥区别???

最普遍的答案 我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的。 可能很多人都已经猜到了,他要的答案是: GET使用URL或Cookie传参。而POST将数...

一生只为虞美人
2018/07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
今天
195
7
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部