Meta referrer标签的简要介绍
作者:
秒速五厘米
referrer就是來路的意思
有四個參數:
never always origin default
簡單說就是,有兩個頁面,A頁面和B頁面,A頁面有一個鏈接鏈接到了B頁面,
A頁面:
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="referrer" content="always"> <title>a</title> </head> <body> <a href="b.html">b</a> </body> </html>
B頁面:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>b</title> </head> <body> <script> console.log(document.referrer); </script> </body> </html>
當A頁面的值為always的時候,B頁面能取得他是從哪個頁面來的。
當A頁面的值為never的時候,B頁面就沒辦法取得他是從哪個頁面來的。
如果在文档中插入 meta 标签,并且 name 属性的值为 referer,浏览器客户端将按照如下步骤处理这个标签:
1.如果 meta 标签中没有 content 属性,则终止下面所有操作 2.将 content 的值复制给 referrer-policy ,并转换为小写 3.检查 content 的值是否为上面 list 中的一个,如果不是,则将值置为 default
上述步骤之后,浏览器后续发起 http 请求的时候,会按照 content 的值,做出如下反应(下面 referer-policy 的值即 meta 标签中 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。
如果页面中包含了如下 meta 标签,所有从当前页面中发起的请求将不会携带 referer:
<meta name="referrer" content="never">
如果页面中包含了如下 meta 标签,则从当前页面中发起的 http请求将只携带 origin 部分(注:根据原文中的语境,我理解这里的 origin 是包含了 schema 和 hostname 的部分 url,不包含 path 等后面的其他 url 部分),而不是完整的 URL :
<meta name="referrer" content="origin">
注意:在使用本文中所述的 meta 标签的时候,浏览器原有的 referer 策略将被打破,比如从 http 协议的页面跳转到 https 的页面的时候,如果设置了适当的值,也会携带 referer。
这与 rel=noreferer 有什么关系呢?可能 rel=noreferer 会覆盖掉本文中的 meta 标签所设置的值。也就是功能覆盖。
origin 信息不是一个完整的 url,所以浏览器客户端估计会在 origin 后面加一个 / 来作为 path 部分。
如果 origin 是唯一的,会发生什么情况呢?估计 referer 会被忽略。