1. 现象: 小程序上线之后出现 次日偶发跳转重新登录页面
2. 场景描述: token 缓存为15日
偶发性,只有我和测试出现,次日登陆小程序 出现 token过期,跳转登陆页面
登陆之后短时间之内没有出现问题
3. 排查:
1.首先把log补全了, 网关打印log,接口打印log
2. nginx 请求log 有url 参数,但是没有请求头的信息
3. 也查看了一些小程序的缓存时间,是否有自动删除策略,答案是并没有,小程序不会删除,我自己也没有删除小程序的缓存。不是这个问题
4. 找到问题:
1. 通过打印log ,一开始我是在idea 打印的服务器日志log....找到问题token串被吞10个字符
2. 找到前端,询问代码。前端代码并没有问题。再次查看log,复制的正常串,以为是idea 的问题。。。(其实并不是,idea没有吞串,就是有问题)
3. 此时笔者还想到一个方案(前端发版,将拦截器 出现token 过期接口代码处,将错误信息,当时的地址,路由,请求头,参数。新增一个接口,将错误信息发送到服务器。嗯.被否决,不能通过频繁发版解决问题...)
4. 继续完善了下打印信息的log,才将问题确定,即 token 出现问题,被吞掉10个字符,此时已经确定的是,前端没有问题,后端网关也没有问题,将问题缩小到nginx 转发上。百度搜索,nginx 请求头信息丢失,发现关键处
5. 由于是nginx 转发。请求头中的token 含有下划线。转发时下划线_ 并没传输所致
# 有问题的串
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjczLCJyblN0ciI6Ilh5U2hJYm5xMjdyakpQWjlVZpVnVKd1BnIn0.YkKAd9C2BSjnjjcAludigzO7stviLjbTF4_dq6xToVU
# 正常串
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjczLCJyblN0ciI6Ilh5U2hJYm5xMjdyakpQWjlValpvZVl0UXZpVnVKd1BnIn0.YkKAd9C2BSjnjjcAludigzO7stviLjbTF4_dq6xToVU
5. 解决问题:
nginx 配置文件中 添加配置参数,将下划线校验去除,解决问题
http{
***
#1. 复制到http 下 去除下划线限制,并重启nginx.. 重启前建议./nginx -t 验证下配置是否可行
underscores_in_headers on;
***
}
6. 总结:
1. 多打印log
2. 细心很重要
3. 整个请求链路,通顺,解决问题更快