http - url长度限制 - post请求参数长度




不同浏览器中URL的最大长度是多少? (11)

简短回答 - 事实上限制为2000个字符

如果您将URL保持在2000个字符以下,它们几乎可以在客户端和服务器软件的任何组合中使用。

如果您要定位特定浏览器,请参阅下文,了解具体限制的详细信息。

更长的答案 - 首先,标准......

RFC 2616 (超文本传输​​协议HTTP / 1.1)第3.2.1节说

HTTP协议不对URI的长度设置任何先验限制。 服务器必须能够处理它们所服务的任何资源的URI,并且如果它们提供可以生成这种URI的基于GET的表单,则应该能够处理无限长度的URI。 如果URI长于服务器可以处理的长度,服务器应该返回414(Request-URI Too Long)状态(参见10.4.15节)。

RFC7230已经废弃了RFC,这是对HTTP / 1.1规范的刷新。 它包含类似的语言,但也继续建议:

在实践中发现了对请求线长度的各种临时限制。 建议所有HTTP发件人和收件人至少支持8000个八位字节的请求行长度。

......和现实

这就是标准所说的。 对于现实 ,请参阅boutell.com上的这项研究,了解各个浏览器和服务器实现将支持哪些内容。 值得一读,但执行摘要是:

极长的URL通常是一个错误。 超过2,000个字符的网址在最受欢迎的网络浏览器中无效。 如果您希望您的网站为大多数互联网用户工作,请不要使用它们。

(注意:这是2006年写的一篇文章的引用,但在2015年IE的使用率下降意味着更长的URL 确实适用于大多数。但是,IE仍然有限制...)

Internet Explorer的局限性......

IE8的最大URL长度是2083个字符 ,似乎IE9有类似的限制

我测试了IE10,地址栏只接受2083个字符。 您可以单击长于此的URL,但地址栏仍将仅显示此链接的2083个字符。

在IE Internals博客上有一篇很好的文章 ,其中介绍了一些背景知识。

有混合报告IE11支持更长的URLS - 请参阅下面的评论。 鉴于有些人报告问题,一般建议仍然存在。

搜索引擎,如网址<2048字符...

请注意, 站点地址协议允许站点通知搜索引擎可用的页面,URL中的限制为2048个字符。 如果您打算使用站点地图,则已经为您决定了限制! (见下面的Calin-Andrei Burloiu的回答 )

从2010年开始,还有一些关于搜索引擎将抓取和索引最大URL长度的研究。 他们发现限制是2047个字符,这似乎与sitemap协议规范相关。 但是,他们还发现Google SERP工具无法处理超过1855个字符的网址。

额外的浏览器综述

我针对配置了非常大的LimitRequestLineLimitRequestFieldSize的Apache 2.4服务器测试了以下内容。

Browser     Address bar   document.location
                          or anchor tag
------------------------------------------
Chrome          32779           >64k
Android          8192           >64k
Firefox          >64k           >64k
Safari           >64k           >64k
IE11             2047           5120
Edge 16          2047          10240

另请参阅下面的Matas Vaitkevicius的答案

这些信息是最新的吗?

这是一个很受欢迎的问题,因为最初的研究是大约12岁,我会尽力保持最新:截至2018年9月 ,这个建议仍然存在。 即使IE11可能接受更长的URL,但旧的IE安装无处不在以及搜索引擎限制意味着保持在2000个字符以下是最好的一般策略。

不同浏览器中URL的最大长度是多少? 浏览器有什么不同?

HTTP协议是否要求它?


ASP.NET 2和SQL Server报告服务2005的限制为2028.我发现这很困难,我的动态URL生成器不会将某些参数传递给超出该点的报告。 这是在Internet Explorer 8下。


Microsoft支持说“Internet Explorer中的最大URL长度为2,083个字符”。

IE的URL存在问题。 Firefox似乎可以正常运行> 4k字符。


URI RFC (其中URL是子集)未定义最大长度,但是,它建议 URI的主机名部分(如果适用)长度不超过255个字符:

URI生成器应使用符合DNS语法的名称,即使DNS的使用不是很明显,也应将这些名称限制为不超过255个字符。

如其他帖子所述,某些浏览器对URL的长度有实际限制。


Sitemaps协议是网站管理员向搜索引擎通知其网站上的网页(也由Google在网站站长工具中使用)的一种方式,支持少于2048个字符的网址。 因此,如果您计划将此功能用于搜索引擎优化,请将此考虑在内。



URL中, Jakob Nielsen建议:

当用户想要互相推荐网页时,网络的社交界面依赖于电子邮件,而电子邮件是用户访问新网站(搜索引擎最常见)的第二常见方式:确保您的所有网址都是网站长度少于78个字符,因此它们不会换行换行。

这不是最大值,但如果您希望共享您的URL,我会认为这是一个实际的最大值。


在iOS上,URL方案没有限制。 即使是300多MB长的URL也被接受。 您可以尝试这样的长网址:

NSString *path = [@"a:" stringByPaddingToLength:314572800 withString:@"a" startingAtIndex:0];
NSString *js = [NSString stringWithFormat:@"window.location.href = \"%@\";", path];
[self.webView stringByEvaluatingJavaScriptFromString:js];

如果成功,请抓住:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSLog(@"length: %@", @(request.URL.absoluteString.length));
    return YES;
}

我写了这个测试,一直在向参数添加'a' ,直到浏览器失败

C#部分:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult ParamTest(string x)
{
    ViewBag.TestLength = 0;
    if (!string.IsNullOrEmpty(x))
    {
        System.IO.File.WriteAllLines("c:/result.txt",
                       new[] {Request.UserAgent, x.Length.ToString()});
        ViewBag.TestLength = x.Length + 1;
    }

    return View();
}

视图:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<script type="text/javascript">
    $(function() {
        var text = "a";
        for (var i = 0; i < parseInt(@ViewBag.TestLength)-1; i++) {
            text += "a";
        }

        document.location.href = "http://localhost:50766/Home/ParamTest?x=" + text;
    });
</script>

第1部分

在Chrome上,我得到了:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
2046

然后爆炸:

HTTP错误404.15 - 未找到请求筛选模块配置为拒绝查询字符串太长的请求。

Internet Explorer 8和Firefox上也一样

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
2046

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0
2046

第2部分

我进入了简易模式,并为IISExpress applicationhost.configweb.config设置maxQueryStringLength="32768" 添加了额外的限制

Chrome failed with message 'Bad Request - Request Too Long

HTTP Error 400. The size of the request headers is too long.

在7744个字符之后。

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
7744

第3部分

Added

<headerLimits>
    <add header="Content-type" sizeLimit="32768" />
</headerLimits>

这根本没有帮助。 我最终决定使用fiddler从头文件中删除引用者。

static function OnBeforeRequest(oSession: Session) {
    if (oSession.url.Contains("localhost:50766")) {
        oSession.RequestHeaders.Remove("Referer");
    }

哪个做得很好。

Chrome:得到15613个字符。 (我猜这是IIS的16K限制)

它又失败了:

<BODY><h2>Bad Request - Request Too Long</h2>
<hr><p>HTTP Error 400. The size of the request headers is too long.</p>


Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
15613

火狐:

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0
15708

Internet Explorer 8因iexplore.exe崩溃而失败。

2505之后

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
2505

Android模拟器

Mozilla/5.0 (Linux; Android 5.1; Android SDK built for x86 Build/LKY45) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36
7377

Internet Explorer 11

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)
4043

Internet Explorer 10

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)
4043

Internet Explorer 9

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
4043

我有使用SharePoint 2007,2010的经验,在这种情况下,SharePoint可以从服务器端创建长度URL的限制,因此它主要取决于:1)客户端(浏览器,版本和操作系统)和2)服务器技术,IIS,Apache等


限制请求行指令设置URL的最大长度。 默认情况下,它设置为8190,这为您提供了大量空间。 但是其他服务器和一些浏览,限制了更长的时间。

由于所有参数都在URL行上传递,因此隐藏字段密码中的项目也将显示在URL中。 移动设备都不应该用于真正的安全措施,并且应该被视为化妆品安全性。







browser