『QQ:1353814576』

从https站点跳转到http站点时获取不到referer的解决方案


问题描述:

想给站点分类目录模块开发一个根据访问来源域名 进行访问次数统计的功能 然后根据访问次数进行排名展现, 主要目的是设想着后期提升被收录站点自行添加我的友链的期望

代码实现的逻辑就是,每次域名主页面被访问时,后台通过请求的referer来获取来访页面地址从而分析得出域名,再根据域名去匹配本地收录站点的数据,从而更新被收录站点的访问次数信息,功能不复杂花了一上午时间本地基本测试没问题了就发布到线上,然而却发现了一个坑爹的问题,从从Https跳转到Http时获取不到referer 也就是获取不到访问来源


问题原因

HTTP/1.1: Security Considerations

Clients SHOULD NOT include a Referer header field in a (non-secure) HTTP request if the referring page was transferred with a secure protocol.

大概情况是这样的:

假设 A站点和B站点是https ,C站点是http

  1. 情况1:A或者B跳转到C 浏览器是不传递 referer信息的 也就是我碰到的情况

  2. 情况2. C跳转A 或者 C跳转B 浏览器传递 referer信息的 也就是A和B可以获取C的referer信息

  3. 情况3. A跳转B 或者 B跳转A 浏览器传递 referer信息的 也就是A和B可以互相获取referer信息


以下有两个解决方案可供参考

一、Https端修改让浏览器放行的解决方案

给来源页面增加一个Meta信息头,来建议浏览器发送Referer,但是这个不是统一的标准,不能保证每个浏览器都会听话的执行,最主要的是牺牲了安全性,不太可取。

<meta content="always" name="referrer">

二、Http端修改的解决方案

除了将http站点升级成Https,否则没有什么比较好好的办法(除非你能控制用户只能使用你要求的浏览器)

总结

原本打算升级个https试试 看了下阿里云的价格放弃了,价格贵不说 还只能按年买,真的是花钱事事易,没钱万事难。
网上也有免费的https证书,只是有效期较短,容易出问题,就不折腾了。