情况1:从百度等站外链接点击访问网站(如在百度搜索网站,然后通过快照链接);
情况2:从手机短信里分享的链接点击访问网站(如从提醒短信里直接点击链接);
情况3:在网站内页面切换时访问网站(如从网站页面A链接到页面B);
情况4:从微信群或公众平台链接点击访问网站(如从微信群里的分享链接或公众平台的菜单链接)。
分析:
以上情况的共同点就是都需要通过登录后进行跳转到源地址。
解决:
以会员登录控制器为检查入口,引入一个from参数(人为),结合页面请求报头referer参数(HTTP协议自带),对于以上4种情况做判断,第一步判断from参数,第二步判断referer参数,这里之所以采用两步,是因为这样做方便我们处理比较特殊的跳转,如类似情况2的需求。
效果如:http://www.xxx.com/passport/login?from=登录需要跳转到的链接
对于情况1,百度等外站链接过来的访问,from参数肯定是不存在的(为空),对于外站链接过来的,在登录后不需要再跳转到外站,所以这里通过域名不一致性直接忽略跳转地址,如果判断referer参数也是外站的网址,也是直接忽略,这样的处理对于以上所有的情况都是通用的。
对于情况2,先判断是站内链接,然后再判断from参数,可能是空的(存在更好),referer参数如果为空,那么将from的参数值重置为当前链接。
对于情况3,处理是比较简单的,通过读取referer参数值,传递给from参数来记录,这样可以做到全站统一跟踪方式。
对于情况4,将自定义的from参数打包到微信登录授权认证的链接里(redirect_uri),让微信认证完成后带回我们的服务器,通过from参数来传递登录后需要跳转的地址。
以上四种情况,优先使用from参数的形式来做,referer参数为辅,基本可做到无错误跳转。