我们知道,在页面引入资源,或从一个页面跳转至另一个页面,都会产生新的 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";
转载请注明:逗比根据地 » Referrer Policy 概述