时间:2010-07-24 17:57:52

标签: ajax http-headers browser

5 个答案:

答案 0 :(得分:40)

简答:

相同的行为:否

热门浏览器中的最低限制:

  • 每个标题10KB
  • 一个响应中所有标头的256 KB。

运行Mac OS X 10.6.4的MacBook测试结果:

成功加载最大响应,所有数据都在一个标题中:

  • Opera 10:150MB
  • Safari 5:20MB
  • IE 6 via Wine:10MB
  • Chrome 5:250KB
  • Firefox 3.6:10KB

注意 Opera,Safari和IE中那些令人毛骨悚然的大标题需要几分钟才能加载。

Chrome注意事项: 整个HTTP标头的实际限制似乎是256KB。 出现错误消息:“错误325(net :: ERR_RESPONSE_HEADERS_TOO_BIG):未知错误。”

Firefox注意事项: 当通过多个标题发送数据时,100MB工作正常,只需要分割超过10'000个标题。

我的结论: 如果你想支持所有流行的浏览器,每个标题10KB似乎是限制,所有标题一起是256KB。

我的PHP代码用于生成这些响应:

<?php

ini_set('memory_limit', '1024M');
set_time_limit(90);
$header = "";

$bytes = 256000;

for($i=0;$i<$bytes;$i++) {
    $header .= "1";
}

header("MyData: ".$header);
/* Firfox multiple headers
for($i=1;$i<1000;$i++) {
    header("MyData".$i.": ".$header);
}*/

echo "Length of header: ".($bytes / 1024).' kilobytes';

?>

答案 1 :(得分:8)

在实践中,虽然有规则禁止代理不传递某些标题(实际上,非常明确的规则可以修改,甚至如何通知代理是否可以修改由以后的标准添加的新标题) ,这仅适用于“透明”代理,并非所有代理都是透明的。特别是,一些擦除标题,他们不理解为故意的安全实践。

另外,在实践中,有些人行为不端(虽然事情比他们好得多)。

因此,除了明显的核心标题之外,您可以依赖从服务器传递到客户端的标头信息量为零。

这只是为什么你永远不应该依赖于标题使用得好的原因之一(例如,为客户端重复请求它应该缓存的东西,或者服务器在你发送整个实体时请求范围),除非明显的认证标题(在无法保证的原则下)。

答案 2 :(得分:4)

两件事。

首先,为什么不运行一个测试,让浏览器逐渐增大和扩大标题,并等到它达到一个不起作用的数字?只需在每个浏览器中运行一次。这是解决这个问题的最可靠方法。即使它并不完全全面,你至少还有一些实用的数字,这些数字可能会覆盖绝大多数用户。

其次,我同意所有人的意见,这是一个坏主意。如果你真的关心达到极限,那么找到一个不同的解决方案应该不难。即使您在每个浏览器上进行测试,仍然需要担心防火墙等,并且绝对没有办法测试每个组合(我几乎肯定没有其他人在您之前做过此操作) 。对于每个案例,你都无法获得硬性限制。

虽然理论上,但这一切都应该可以正常进行,如果你决定这样做,可能会有一个边缘案例会让你陷入困境。

TL; DR:这是一个坏主意。省去麻烦并找到真正的解决方案,而不是解决方法。


编辑:由于您提到请求可能来自多种类型的来源,为什么不在请求标头中指定源并将数据完全包含在正文中?标头中有某种SourceClientType字段,用于指定请求的来源。如果它来自浏览器,请在正文中包含HTML;如果它来自PHP应用程序,请在其中放置一些特定于PHP的内容;等等。如果该字段为空,则根本不添加任何额外数据。

答案 3 :(得分:2)

答案 4 :(得分:1)

理论上,可以在浏览器中发送的数据量没有限制。这几乎就像是说网页正文中的内容数量有限。

如果可能,尝试通过文档正文传输数据。为了安全起见,请考虑将数据拆分,以便有多个加载过程。