通常情况下,用户浏览需要登录验证的页面a,我们会将页面跳转到登录页b,并带上页面a的url。在用户通过登录验证后,跳转到页面a,让用户继续访问。
在我们的项目里,我看到同事在php的登陆验证接口login里,用$_SERVER['HTTP_REFERER']获取并输出referer,前端同事拿到referer并确保服务端确认用户通过登录验证后,将页面重定向了referer。
事实上,http请求中的referer,就是发起http请求的当前页面的url,并不是当前页面的document.referrer。同事代码的结果就是,页面没有跳转到用户想访问的页面(即上述的页面a),而是再一次跳转到登录页。
经过查找资料得知,http_referer由浏览器生成,并不是所有浏览器都会设置该值,http_referer可以伪造,不可信。此处login接口返回http_referer的做法并不妥当。
应该用php的current_url()获取用户当前访问页面的url(即页面a),判断用户需要登录验证且用户未登录,内部重定向到登录页login并带上current_url()获取到的url。前端同事拿到这个url(假设为c),在得到服务单返回用户已通过登录验证的响应后,把页面重定向到c。因为current_url()拿到的是页面a的正确url,所以用户可以继续访问页面a。