前几天同事解决了一个非常诡异的bug,用户的对话中,出现了非自己的说的内容。他给我们分享的这个bug得产生的原因,以及解决过程,我觉得很有意义,所以总结写篇博客。
1 产生bug的原因?
用户A请求 /index/index页面
A1:发起/index/index请求。
A2,A3:Nginx发现index/inde缓存的页面失效
A4:从后端的web server中获取index/index信息
A5:缓存A用户的响应头(包括cookie信息)+内容信息
A6:发送给用户数据,这时候会把响应头的cookie信息写入到浏览器。
缓存B用户的响应头(包括cookie信息)+内容信息
B1:发起/index/index请求。
B2:nginx发现index/index缓存的信息没有失效,直接把缓存的响应头+页面内容返回给了B
B3:B响应头里面是A的cookie信息,这时候,会把A的cookie种在A的浏览器里面,这时候A与B就串会话了。
2 怎么发现bug的?
通过curl -v 调试页面,发现响应头会进行写入cookie操作
3 怎么解决?
nginx会把响应页面的头信息也一起缓存,包括Set-cookie,导致后面访问页面的用户的cookie被设置成缓存的头。 解决方案,nginx提供proxy_hide_header的指令,可以去掉相关的响应头信息:
proxy_hide_header Set-Cookie;
proxy_hide_header Set-Cookie;
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!