最近有人所反馈在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…