在页面上引用图片、CSS、JS 等资源,或页面跳转时,都会产生 HTTP 请求,浏览器会在这些请求头上加上表示来源的字段:Referrer
。
HTTP 规范是这么描述该字段的:
Referrer
请求头字段允许由客户端指定资源的 URI 来自于哪一个请求地址
Referer
字段有很多用途,如收集用户信息、日志分析、防止跨站请求伪造)、防盗链等。
Referer vs Referrer
HTTP 协议中有一个用来表示页面或资源来源的请求头,由 Philip Hallam-Baker 于上世纪 90 年代提出来,他当时把这个请求头叫做 Referer
,并最终写进了 RFC1945,也就是 HTTP/1.0 协议:
The Referer request-header field allows the client to specify, for the server’s benefit, the address (URI) of the resource from which the Request-URI was obtained.
但是这个单词被他拼错了,正确的拼写应该是 Referrer
。但是这个错误被发现之前,已经被大量使用,如果要改过来需要所有服务端、客户端的一致配合,还有大量的代码需要排查修改。于是,HTTP 的标准制定者们决定将错就错。
下面这段描述来自于 FC2616,也就是著名的 HTTP/1.1 协议:
The Referer[sic] request-header field allows the client to specify, for the server’s benefit, the address (URI) of the resource from which the Request-URI was obtained (the “referrer”, although the header field is misspelled.)
相比 HTTP/1.0,HTTP/1.1 除了加上了对这个错误的说明之外,没有其他变化。 [sic]
在拉丁文中表示原文如此,很多其他标准在表述 HTTP 中的 Referer
请求头时,都会加上 [sic]
,避免引起读者误解。
由于 HTTP 协议将错就错,浏览器当然只好按错的来,服务端收到的也是拼错的,因而大部分 Web Server、服务端语言或框架,都跟着拼错。大部分 Web Server、服务端语言或框架,都跟着拼错。
但是在浏览器中,浏览器厂商采用了正确的拼写 Referrer
:document.referrer、request.referrer 以及 Referrer Policy。
Referrer Policy
2014 年,W3C Web 应用安全工作组(Web Application Security Working Group)发布了 Referrer Policy 草案,对浏览器该如何发送 Referrer 做了详细的规定。
根据草案描述,我们可以针对性的隐藏 Referrer
、或者只发送来源 URL 的 host 部分,但不允许篡改 Referrer
。
草案规定了以下几种策略:
no-referrer
任何情况下都不发送
Referrer
信息no-referrer-when-downgrade
默认策略,只有在发生协议降级的情况下不发送
Referrer
信息,如 HTTPS 页面中引入 HTTP 资源、HTTPS 跳转至 HTTP 等‘’
空字符串,等同于
no-referrer-when-downgrade
origin
任何情况下都发送
Referrer
信息,但Referrer
只包含请求协议和 host,不包含具体的路径和参数信息origin-when-cross-origin
只有在跨域访问时发送只包含协议和 host 的
Referrer
信息,同域的情况下发送完成的Referrer
same-origin
同域情况下才发送
Referrer
信息,跨域不发送strict-origin
在协议降级的情况下不发送
Referrer
信息,其他情况下发送包含协议和 host 的信息strict-origin-when-cross-origin
在同源情况下发送完整的
Referrer
信息;跨域且同等安全级别下发送只包含协议和 host 部分;协议降级的情况下不发送unsafe-url
任何情况下都发送完整的
Referrer
信息
Referrer Policy Delivery
设置 Referrer Policy 有以下 3 种方式:
CSP
CSP 规范的 1.1 版本 中支持设置
referrer
信息,但在 2.0 版本referrer
只是只读字段,不与许设置。1
Content-Security-Policy: referrer no-referrer|no-referrer-when-downgrade|origin|origin-when-cross-origin|unsafe-url;
meta
<meta>
只能放在<head>
中1
<meta name="referrer" content="no-referrer|no-referrer-when-downgrade|origin|origin-when-crossorigin|unsafe-url">
a 标签 referrer 属性
策略优先级比 CSP、
<meta>
要高。1
<a href="http://example.com" referrer="no-referrer|origin|unsafe-url">xxx</a>
兼容性
- IE11 之前的版本不支持
- IE11 、Edge、Safari(8~11) 仅支持旧版草案(已废弃)
- 其它主流浏览器均支持