cookie过大导致请求失败

4,521 阅读2分钟

最近有人所反馈在ios中出现了七巧板页面内的异步请求都失败的问题,也是个别手机,不容易复现。后来找到一个可复现的手机抓包发现请求失败的报错为

Remote server closed the connection before sending response header

应该是server都没有接到请求。

之后google了一翻,找到了一个帖子,描述的情况和我们的基本一致,大概意思就是请求中的header过大导致的服务器拒绝接收请求。

有线索之后,ios的小伙伴也有同样的方式模拟了一下header过大的情况,果然,当header大小为5k时就报了和线上一样的错误,那应该就是这个问题。 之后找到server同学,种cookie的始作俑者,让他简化了cookie的内容,解决了此问题。

那么问题来了,HEADER的大小限制到底是多少呢?

我们使用nginx做为web服务器,查了一上官方文档,nginx可以配置header的大小,但是默认的是1k.

Syntax:	client_header_buffer_size size;
Default: client_header_buffer_size 1k;
Context: http, server

那就找找线上的配置,看看是否配置的小于5k呢,找到后发现并不是,配置的是1M:

后来一想,header有大小限制,浏览器也有cookie的大小限制,一般的浏览器的cookie大小都只有4k,我们有超过5k的cookie那是不是就会导致请求失败呢? 本地模拟了一下,果然出现了一样的错误。

那我们来看一下,各个浏览器上cookie的大小限制都是多少,用这个网站

  • chrome每个域名是没有大小限制的
  • firefox每个域名是没有大小限制的
  • IE的大小限制是在4096到10234之间
  • Opera每个域名允许4096个字节
  • Safari每个域名允许4096个字节

从目前的实验可以得出在safari下cookie超出4k,请求就会被截断,不会发送到服务器端。所以我们的cookie要尽量保持精简,无论是后端还是前端对待cookie都要保持克制。

另外,对于不同的web服务器的http header默认大小是不一样,比如

上边说的nginx的header默认是1k

tomcat的maxHttpHeaderSize默认限制是8k

node.js的header大小默认是8k

参考:
www.lifewire.com/cookie-limi…
cnbin.github.io/blog/2016/0…
cloud.tencent.com/developer/n…