南琴浪博客

Referrer Policy 概述

05/31/2018

我们知道,在页面引入资源,或从一个页面跳转至另一个页面,都会产生新的 HTTP Request。这时浏览器一般会为这些 Request 加上表示来源的 Referrer 字段,也就是我们常说的 http_referer 头部。

HTTP 来源地址(HTTP Referer)是 HTTP 表头的一个字段,用来表示从哪儿链接到目前的网页,采用的格式是 URL。换句话说,借着 HTTP 来源地址,目前的网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。

有一个有趣的是,可能已经有读者发现了,上文提及的来源头部的单词写法是 “HTTP Referer”,而本文标题的写法却是 “Referrer”。这是因为,Referer 的正确英语拼法是 Referrer。由于早期 HTTP 规范的拼写错误,为保持向下兼容就将错就错了。

Referrer 在分析用户来源时很有用,有着广泛和常见的使用。而 URL 可能包含某些敏感信息,若被第三方获取就会造成麻烦。这种时候,网站所有者就需要能让客户端(浏览器)按照该站点的意愿来决定 Referrer 发送的相关规则。

为了实现这个目的,2014 年,W3C 的 Web 应用安全工作组(Web Application Security Working Group)发布了 Referrer Policy 草案,对浏览器该如何发送 Referrer 做了详细的规定。到了 2018 年的现在,各大浏览器均已提供对 Referrer Policy 的支持。自此,站点所有者终于可以灵活地控制自己网站的 Referrer 发送策略了。

Definition

Referrer Policy 是通过 HTTP Response Header 进行定义的:

Referrer-Policy: ${value}"

其中,value 有以下值可选:

定义
no-referrer任何情况下都不发送 Referrer 信息
no-referrer-when-downgrade仅当发生协议降级(如 HTTPS 页面引入 HTTP 资源,从 HTTPS 页面跳到 HTTP 等)时不发送 Referrer 信息。这个规则基本是现代浏览器的默认规则(在网站没有自定义 Referrer Policy 时所默认采用的规则)
origin在任何情况下,仅发送当前网站 Host 作为引用地址。例如 https://example.com/page.html 会将 https://example.com/ 作为引用地址
origin-when-cross-origin同域请求发送完整 Referrer 信息;跨域请求仅发送 Host 信息
same-origin同域请求发送完整 Referrer 信息;跨域请求不发送任何信息
strict-origin协议同级请求(HTTPS -> HTTPS)仅发送 Host 信息;协议降级请求不发送任何信息
strict-origin-when-cross-origin同域请求发送完整 Referrer 信息;跨域协议同级请求仅发送 Host 信息;跨域协议降级请求不发送任何信息
unsafe-url任何情况下都发送完整 Referrer 信息。该规则会将受 TLS 安全协议保护的资源的源和路径信息泄露给非安全的源服务器,进行此项设置时需慎重考虑

Nginx

在 Nginx 上定义该响应头:

add_header  Referrer-Policy  "${value}";

本站使用 same-origin 规则:

add_header  Referrer-Policy  "same-origin";