分析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 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长度的限制主要取决于服务器以及客户端的限制。

 

然后先从服务器端入手:

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

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

关于http请求url长度以及请求消息体长度的研究(一)(服务器端)
  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请求url长度以及请求消息体长度的研究(一)(服务器端)
http://httpd.apache.org/docs/2.0/mod/core.html#limitrequestbody

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

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

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

large_client_header_buffers

关于http请求url长度以及请求消息体长度的研究(一)(服务器端)

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

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

client_header_buffer_size

关于http请求url长度以及请求消息体长度的研究(一)(服务器端)
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请求url长度以及请求消息体长度的研究(一)(服务器端)

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


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

<think>首先,用户的问题是:"我想查询URL GET请求传值的最大长度",这在用户的消息中明确提到。用户引用了多个来源,我需要基于这些引用提供准确答案。 关键引用: - 引用[1]:解释了GET请求长度限制不是由HTTP协议规范设定的,而是由特定的浏览器和服务器限制的。提供了各种浏览器和服务器对URL长度的最大处理能力: - IE:2083个字符 - Firefox:65536个字符 - Safari:80000个字符 - Opera:190000个字符 - Google (Chrome):8182个字符 - Apache:8192个字符 (准确度待定) - IIS:16384个字符 同时提到,HTTP协议没有对URL长度限制,限制来自浏览器和服务器。POST理论上没有大小限制,但服务器可能有处理能力限制。 - 引用[2]:讨论了URL传值和POST传值,指出GET传值在URL中不安全且数据量受限制。 - 引用[3]:关于LimitRequestLine指令,用于设置服务器允许的URL最大长度。 - 引用[4]:关于HTTP和GET方法的介绍,但用户已说明这些引用仅供参考,不是真正需求。 用户明确说:"上述引用仅供参考,并不是用户真正的需求",所以我应该专注于用户的核心问题:URL GET请求传值的最大长度。 从引用中提取关键点: - HTTP协议本身没有限制URL长度。 - 实际限制由浏览器和服务器决定。 - 常见浏览器限制:Chrome ~8000字符,IE ~2000字符等。 - 服务器如Apache或IIS也有配置限制。 用户的问题指定了"URL GET请求传值的最大长度",这涉及到URL中查询字符串的长度(即?之后的部分)。引用[1]和[2]都提到了这一点。 我的回答需要: - 使用中文,因为系统指令要求。 - 结构清晰,逐步解答。 - 确保LaTeX语法正确:行内数学表达式用$...$,独立公式用$$...$$(如果需要)。 - 添加引用标识:[^n],基于引用的内容。 - 生成相关问题(系统指令第5点)。 回答结构: 1. **澄清HTTP协议规范**:解释HTTP协议没有URL长度限制。 2. **浏览器限制**:列出主要浏览器的实际限制。 3. **服务器限制**:讨论服务器端的配置如Apache的LimitRequestLine。 4. **实际应用建议**:建议使用POST处理大数据的理由(安全性、长度)。 5. **总结最大长度**:给出一个一般性答案,强调它取决于环境和配置。 引用标识: - 在相关段落末尾添加[^n],例如,提到浏览器限制时引用[^1],服务器限制时引用[^3]。 生成相关问题: - 基于主题,如如何配置服务器、为什么使用POST等。 完整回答: - 先直接回答用户问题。 - 然后详细解释。 - 最后生成相关问题。 确保答案真实可靠:基于提供的引用,避免添加未提及的内容。引用[1]是主要来源。 最终答案大纲: 1. 介绍:GET请求的最大长度不是固定的;HTTP协议无限制,但浏览器和服务器有实际限制。 2. 详细浏览器限制(引用[^1])。 3. 服务器限制(引用[^3])。 4. 建议:如果需要传递大量数据,使用POST。 5. 生成相关问题。 </think>### URL GET请求传值的最大长度 URL GET请求的最大长度并不由HTTP协议本身规定,而是受浏览器和服务器实现的限制。HTTP协议规范(如RFC 2616)明确表示URI长度无强制上限[^3],但在实际应用中,不同浏览器和服务器会施加具约束,以避免性能问题或安全风险。以下我将逐步解释关键点,帮助您清晰理解。 #### 1. **HTTP协议规范无限制** - HTTP GET请求URL长度理论上无上限,因为协议未定义任何最大长度。这包括主机名、路径和查询字符串(即`?`之后的键值对)。引用[3]指出,URL长度限制主要源于服务器的配置,例如Apache的`LimitRequestLine`指令,用于设置请求行的最大字节数(请求行包括方法、URL和协议版本)[^3]。这意味着,协议本身允许任意长度,但实际执行中受环境制约。 #### 2. **浏览器端的实际限制** - 浏览器是主要限制来源,不同浏览器对URL的最大长度有严格上限(基于字符数)。这些限制是为了防止内存溢出或渲染问题。以下是常见浏览器的实测限制: - **Internet Explorer (IE)**:最大约2083个字符(超出后请求可能失败)[^1]。 - **Google Chrome**:最大约8182个字符[^1]。 - **Firefox**:最大约65536个字符[^1]。 - **Safari**:最大约80000个字符[^1]。 - **Opera**:最大约190000个字符[^1]。 - 这些数值基于网络实测数据,但可能随浏览器版本更新而变化。超过限制时,浏览器可能截断URL或拒绝发送请求。 #### 3. **服务器端的实际限制** - 服务器软件也设置URL长度上限,以保护资源: - **Apache HTTP Server**:默认最大URL长度约8192字节(可通过`LimitRequestLine`指令调整)[^1][^3],例如: ```apache LimitRequestLine 16384 # 修改为16KB ``` - **Microsoft IIS (Internet Information Services)**:默认最大约16384个字符[^1]。 - **Tomcat (Java服务器)**:虽未直接限制URL,但GET请求长度受整请求头大小影响(默认8KB)[^1]。 - 服务器限制通常可配置,但需权衡性能和安全性。 #### 4. **查询字符串部分的长度影响** - GET请求的“传值”部分指URL中的查询字符串(例如`example.com?key1=value1&key2=value2`)。引用[2]强调,查询字符串会暴露在URL中,存在安全风险(如数据泄露),且长度受浏览器和服务器限制[^2]。 - **实际建议**: - 如果传递小量数据(如少于2000字符),GET适用于简单查询。 - 如果数据量大或敏感(如表单提交),优先使用POST方法。POST的数据(body)理论上无长度限制,HTTP协议未规定上限,但服务器可能有处理阈值(如Tomcat默认限2MB,可配置)[^1][^2]。 #### 5. **总结最大长度** - **一般性答案**:URL GET请求传值的最大长度**无统一标准**,取决于: - 浏览器限制(通常8000–190000字符)。 - 服务器配置(通常8000–16000字节)。 - 保守实践中,建议将查询字符串控制在**2000字符以内**以确保兼容性。超出时,改用POST方法更可靠。 如果您需要精确测试特定环境,可以使用工具如浏览器开发者工具或在线URL长度测试器进行验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值