Referer

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/433c1611-64f1-4d8f-bc93-7bbc88a76e2e/Untitled.png

这个字段是可选的。客户端发送请求的时候,自主决定是否加上该字段。

很有趣的是,这个字段的拼写是错的。Referer 的正确拼写是 Referrer,但是写入标准的时候,不知为何,没人发现少了一个字母 r。标准定案以后,只能将错就错,所有头信息的该字段都一律错误拼写成 Referer

Referer 的发生场景

浏览器向服务器请求资源的时候,Referer 字段的逻辑是这样的

<!-- 加载图片 -->
<img src="foo.jpg">

<!-- 加载脚本 -->
<script src="foo.js"></script>

<!-- 加载样式 -->
<link href="foo.css" rel="stylesheet">

上面这些场景,浏览器都会将当前网址作为 Referer 字段,放在 HTTP 请求的头信息发送。

浏览器的 JavaScript 引擎提供 document.referrer 属性,可以查看当前页面的引荐来源。注意,这里采用的是正确拼写。

Referer 的作用

Referer 字段实际上告诉了服务器,用户在访问当前资源之前的位置。这往往可以用来用户跟踪。

一个典型的应用是,有些网站不允许图片外链,只有自家的网站才能显示图片,外部网站加载图片就会报错。它的实现就是基于 Referer 字段,如果该字段的网址是自家网址,就放行。

由于涉及隐私,很多时候不适合发送 Referer 字段。

这里举两个例子,都不适合暴露 URL。一个是功能 URL,即有的 URL 不要登录,可以访问,就能直接完成密码重置、邮件退订等功能。另一个是内网 URL,不希望外部用户知道内网有这样的地址。Referer 字段很可能把这些 URL 暴露出去。