点击左侧的元素可以返回到上一个页面,我们可以简单写一段JS代码:
var back = document.getElementById('back'); //假设该返回按钮元素id为back back.onclick = function(){ history.back(); //返回上一个页面,也可以写成history.go(-1) // 或者 <a id="back" href="javascript:history.back();" rel="external nofollow" ></a> 咦?上面说了这么多,还是没有说到document.referrer有什么用呀!别急,前面只是铺垫,接下来步入正题~~~ 虽说感觉上面这样已经基本上实现了返回上一页的功能,但是有一种情况没有考虑到(我们程序员还是要严谨一点嘛),就是假如该页面是别人分享过来的而不是通过其他页面进入的呢?那么点击该按钮将不会有任何反应,因为此时history对象中不存在历史记录,也就是说这是你浏览器窗口打开时浏览的第一个页面。 为了优化用户体验,这里通常有两种解决方案。一种是在打开第一个页面时不显示返回上一页按钮,另一种是点击直接跳转到网站首页,这可以根据产品需求来选择合适的方案。 这里假设选择第一种方案,我们可以这样写段JS: if(document.referrer){ back.style.display = 'block'; //默认让其隐藏,当referrer属性不为空时让其显示 //分享页 返回上一页 if (typeof document.referrer === '') { // 没有来源页面信息的时候,改成首页URL地址 $('.jsBack').attr('href', '/'); 其实判断当前页面是否是用户一开始打开的页面,方法也不止通过判断referrer属性这一种方法,还可以通过history.length是否为零来判断。 浏览器支持情况: 关于HTTPS请求 如果在一张普通的HTTP页面上点击了HTTPS的链接,那么在https请求头部可以附上Referer信息,之后在HTTPS页面中依然可以用document.referre来获得普通的http页面。 同样,如果是在一张https页面上点击了另一个HTTPS的链接,可以在请求的头部附上Referer信息。 但是如果是从一张https页面点击了http链接,那么很不幸,发送的http请求头里无法包含关于https页面的信息,这可能是出于一种对https页面的保护措施。 伪造Referer信息 根据上文的描述,document.referre源自于Header中的Referer。那么如果想修改document.referre的值,理论上讲,仅需要修改请求Header。可以将Header中现有的Referer替换成自己想要的值,如果原来没有也可以添加Referer。 在客户端,篡改Header是一件非常容易的事情。在一个页面的http请求发出去之前,可以利用截包工具将其拦截,然后分析出头部信息,并且修改Referre。 搜了一下,对于FireFox可以使用RefControl插件方便的进行修改。总之,欺骗Traffic source是轻而易举的事情。 页面强制Refresh <meta http-equiv="Refresh" content="5;URL=a.html"> 则过5秒后浏览器会自动向server发起a页面请求。 经过测试,在IE8,FF3.6-FF4.0中,均不会带有Referer信息,但是chrome却能够鬼使神差的把b.html作为Referer添加进头部。 几种意外丢失情况: 1,直接在浏览器中输入地址 2,使用location.reload()刷新(location.href或者location.replace()刷新有信息) 3,在微信对话框中,点击进入微信自身浏览器, 4,扫码进入微信或QQ的浏览器 5,直接新窗口打开一个页面 6,从https的网站直接进入一个http协议的网站(Chrome下亲测), 7.a标签设置rel="noreferrer"(兼容IE7+) 8,meta标签来控制不让浏览器发送referer 9,点击 flash 内部链接 10,Chrome4.0以下,IE 5.5+以下返回空的字符串,使用 修改 Location 进行页面导航的方法,会导致在IE下丢失 referrer,这可能是IE的一个BUG 11,跨域 12,iframe隐藏 结论:如果你需要通过 document.referrer 采集页面访问来源,最好不要使用 JS 跳转或打开新窗口,也不要使用 meta 跳转。 referrer 的作用: 1,统计来源,可以统计数量,可以拒绝访问 2,返回上一页逻辑判断 喜欢这篇文章?欢迎打赏~~
咦?上面说了这么多,还是没有说到document.referrer有什么用呀!别急,前面只是铺垫,接下来步入正题~~~ 虽说感觉上面这样已经基本上实现了返回上一页的功能,但是有一种情况没有考虑到(我们程序员还是要严谨一点嘛),就是假如该页面是别人分享过来的而不是通过其他页面进入的呢?那么点击该按钮将不会有任何反应,因为此时history对象中不存在历史记录,也就是说这是你浏览器窗口打开时浏览的第一个页面。 为了优化用户体验,这里通常有两种解决方案。一种是在打开第一个页面时不显示返回上一页按钮,另一种是点击直接跳转到网站首页,这可以根据产品需求来选择合适的方案。 这里假设选择第一种方案,我们可以这样写段JS:
if(document.referrer){ back.style.display = 'block'; //默认让其隐藏,当referrer属性不为空时让其显示 //分享页 返回上一页 if (typeof document.referrer === '') { // 没有来源页面信息的时候,改成首页URL地址 $('.jsBack').attr('href', '/'); 其实判断当前页面是否是用户一开始打开的页面,方法也不止通过判断referrer属性这一种方法,还可以通过history.length是否为零来判断。 浏览器支持情况: 关于HTTPS请求 如果在一张普通的HTTP页面上点击了HTTPS的链接,那么在https请求头部可以附上Referer信息,之后在HTTPS页面中依然可以用document.referre来获得普通的http页面。 同样,如果是在一张https页面上点击了另一个HTTPS的链接,可以在请求的头部附上Referer信息。 但是如果是从一张https页面点击了http链接,那么很不幸,发送的http请求头里无法包含关于https页面的信息,这可能是出于一种对https页面的保护措施。 伪造Referer信息 根据上文的描述,document.referre源自于Header中的Referer。那么如果想修改document.referre的值,理论上讲,仅需要修改请求Header。可以将Header中现有的Referer替换成自己想要的值,如果原来没有也可以添加Referer。 在客户端,篡改Header是一件非常容易的事情。在一个页面的http请求发出去之前,可以利用截包工具将其拦截,然后分析出头部信息,并且修改Referre。 搜了一下,对于FireFox可以使用RefControl插件方便的进行修改。总之,欺骗Traffic source是轻而易举的事情。 页面强制Refresh <meta http-equiv="Refresh" content="5;URL=a.html"> 则过5秒后浏览器会自动向server发起a页面请求。 经过测试,在IE8,FF3.6-FF4.0中,均不会带有Referer信息,但是chrome却能够鬼使神差的把b.html作为Referer添加进头部。 几种意外丢失情况: 1,直接在浏览器中输入地址 2,使用location.reload()刷新(location.href或者location.replace()刷新有信息) 3,在微信对话框中,点击进入微信自身浏览器, 4,扫码进入微信或QQ的浏览器 5,直接新窗口打开一个页面 6,从https的网站直接进入一个http协议的网站(Chrome下亲测), 7.a标签设置rel="noreferrer"(兼容IE7+) 8,meta标签来控制不让浏览器发送referer 9,点击 flash 内部链接 10,Chrome4.0以下,IE 5.5+以下返回空的字符串,使用 修改 Location 进行页面导航的方法,会导致在IE下丢失 referrer,这可能是IE的一个BUG 11,跨域 12,iframe隐藏 结论:如果你需要通过 document.referrer 采集页面访问来源,最好不要使用 JS 跳转或打开新窗口,也不要使用 meta 跳转。 referrer 的作用: 1,统计来源,可以统计数量,可以拒绝访问 2,返回上一页逻辑判断 喜欢这篇文章?欢迎打赏~~
其实判断当前页面是否是用户一开始打开的页面,方法也不止通过判断referrer属性这一种方法,还可以通过history.length是否为零来判断。 浏览器支持情况:
关于HTTPS请求 如果在一张普通的HTTP页面上点击了HTTPS的链接,那么在https请求头部可以附上Referer信息,之后在HTTPS页面中依然可以用document.referre来获得普通的http页面。
同样,如果是在一张https页面上点击了另一个HTTPS的链接,可以在请求的头部附上Referer信息。
但是如果是从一张https页面点击了http链接,那么很不幸,发送的http请求头里无法包含关于https页面的信息,这可能是出于一种对https页面的保护措施。 伪造Referer信息 根据上文的描述,document.referre源自于Header中的Referer。那么如果想修改document.referre的值,理论上讲,仅需要修改请求Header。可以将Header中现有的Referer替换成自己想要的值,如果原来没有也可以添加Referer。
在客户端,篡改Header是一件非常容易的事情。在一个页面的http请求发出去之前,可以利用截包工具将其拦截,然后分析出头部信息,并且修改Referre。
搜了一下,对于FireFox可以使用RefControl插件方便的进行修改。总之,欺骗Traffic source是轻而易举的事情。
页面强制Refresh
<meta http-equiv="Refresh" content="5;URL=a.html"> 则过5秒后浏览器会自动向server发起a页面请求。 经过测试,在IE8,FF3.6-FF4.0中,均不会带有Referer信息,但是chrome却能够鬼使神差的把b.html作为Referer添加进头部。 几种意外丢失情况: 1,直接在浏览器中输入地址 2,使用location.reload()刷新(location.href或者location.replace()刷新有信息) 3,在微信对话框中,点击进入微信自身浏览器, 4,扫码进入微信或QQ的浏览器 5,直接新窗口打开一个页面 6,从https的网站直接进入一个http协议的网站(Chrome下亲测), 7.a标签设置rel="noreferrer"(兼容IE7+) 8,meta标签来控制不让浏览器发送referer 9,点击 flash 内部链接 10,Chrome4.0以下,IE 5.5+以下返回空的字符串,使用 修改 Location 进行页面导航的方法,会导致在IE下丢失 referrer,这可能是IE的一个BUG 11,跨域 12,iframe隐藏 结论:如果你需要通过 document.referrer 采集页面访问来源,最好不要使用 JS 跳转或打开新窗口,也不要使用 meta 跳转。 referrer 的作用: 1,统计来源,可以统计数量,可以拒绝访问 2,返回上一页逻辑判断 喜欢这篇文章?欢迎打赏~~
则过5秒后浏览器会自动向server发起a页面请求。
经过测试,在IE8,FF3.6-FF4.0中,均不会带有Referer信息,但是chrome却能够鬼使神差的把b.html作为Referer添加进头部。 几种意外丢失情况: 1,直接在浏览器中输入地址 2,使用location.reload()刷新(location.href或者location.replace()刷新有信息) 3,在微信对话框中,点击进入微信自身浏览器, 4,扫码进入微信或QQ的浏览器 5,直接新窗口打开一个页面 6,从https的网站直接进入一个http协议的网站(Chrome下亲测), 7.a标签设置rel="noreferrer"(兼容IE7+) 8,meta标签来控制不让浏览器发送referer 9,点击 flash 内部链接 10,Chrome4.0以下,IE 5.5+以下返回空的字符串,使用 修改 Location 进行页面导航的方法,会导致在IE下丢失 referrer,这可能是IE的一个BUG 11,跨域 12,iframe隐藏
结论:如果你需要通过 document.referrer 采集页面访问来源,最好不要使用 JS 跳转或打开新窗口,也不要使用 meta 跳转。 referrer 的作用: 1,统计来源,可以统计数量,可以拒绝访问 2,返回上一页逻辑判断
喜欢这篇文章?欢迎打赏~~