我们知道,http referer是一次http请求中的head请求中的一部分信息;
当浏览器从给服务端发送一次请求的时候,一般会带上Referer,告诉服务器
我是从哪个页面链接过来的,举一个时间的例子:
比如有一个网站或页面:
http://www.example.com/a.html
该页面中有一个超链接:
<a href='http://www.example.com/server.php'>点击</a>
在服务器的server.php中我们可以加上调试信息,把整个$_SERVER打印出来,如
var_dump($_SERVER);
当我们在浏览器请求上述页面并渲染后,我们点击此a链接;
整个时候浏览器会请求到服务端server.php,并显示出服务端的输出,其中就包括HTTP_REFERER字段,我们看到它的值是:
["HTTP_REFERER"] => string(50) "http://www.example.com/a.html"很明了,看到该请求是从a.html页面链接过来的;
所以,referer常常被用来统计用户来源,比如www.hao123.com中有好多门户官网的链接;当我们点击“京东”的时候,京东的服务端就可以发现 当前该用户请求是从www.hao123.com中链接过来的,就可以很方便的统计到用户来源;
额外地,referer也常常被用来做防盗链的使用;
比如某个网站的图片是保存在图片服务器或者云端,假如地址为:
http://static.yun.com/img.jpg
我们可以在此图片服务器的服务端配置referer 的值,比如可以配置为
http://example.com/
那么,这样子的话,就仅仅用于从http://example.com/中链接过来的请求访问此图片.
可以有效防止别的网站盗用此图片。当然referer也可以被伪造或模拟,但是这样至少可以防止部分的盗链;
在熟悉了上面关于referer的原理以及基本的用途之后,下面我们讲讲在页面的header 头中的meta信息中如果自定义的控制referer的值:
meta中的referrer参数可以设置为以下几种类型的值:
1.never
2.always
3.origin
4.default
<meta name="referrer" content="origin">
当浏览器发起http请求的时候,会按照content的值而做出具体的反应:
1.如果 referer-policy 的值为never:删除 http head 中的 referer;
2.如果 referer-policy 的值为default:如果当前页面使用的是 https 协议,而正要加载的资源使用的是普通的 http 协议,则将 http header 中的 referer 置为空;
3.如果 referer-policy 的值为 origin:只发送 origin 部分;
4.如果 referer-policy 的值为 always:不改变http header 中的 referer 的值,注意:这种情况下,如果当前页面使用了 https 协议,而要加载的资源使用的是 http 协议,加载资源的请求头中也会携带 referer
以上4种情况,我没有做一一的细测,大家敢兴趣可以一一测试一下即可,比如:
<html>
<head>
<meta name="referrer" content="origin">
</head>
<a href='http://xxx.xxxx.com/index.php/Test/jordytest'>点击</a>
</html>