Referrer 介绍

在页面上引用图片、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、服务端语言或框架,都跟着拼错。

但是在浏览器中,浏览器厂商采用了正确的拼写 Referrerdocument.referrerrequest.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 信息

Policy Document Navigation to Referrer
no-referrer https://example.com/page.html any domain or path no referrer
no-referrer-when-downgrade https://example.com/page.html https://example.com/not-page.html https://example.com/page.html
https://example.com/page.html https://not.example.com/not-page.html https://example.com/page.html
https://example.com/page.html http://example.com/not-page.html no referrer
http://example.com/page.html https://not.example.com/ http://example.com/page.html
origin https://example.com/page.html any domain or path https://example.com
http://example.com/page.html any domain or path http://example.com
origin-when-cross-origin https://example.com/page.html https://example.com/not-page.html https://example.com/page.html
https://example.com/page.html https://not.example.com/page.html https://example.com
https://example.com/page.html http://example.com/page.html https://example.com
same-origin https://example.com/page.html https://example.com/not-page.html https://example.com/page.html
https://example.com/page.html https://not.example.com/page.html no referrer
strict-origin https://example.com/page.html https://not.example.com/page.html https://example.com
https://example.com/page.html http://example.com/page.html no referrer
http://example.com/page.html any domain or path http://example.com
strict-origin-when-cross-origin https://example.com/page.html https://example.com/not-page.html https://example.com/page.html
https://example.com/page.html https://not.example.com/page.html https://example.com
https://example.com/page.html http://example.com/page.html no referrer
http://example.com/page.html any domain or path http://example.com
unsafe-url https://example.com/page.html any domain or path https://example.com/page.html

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>

兼容性

参考