一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
背景
线上页面被爬了,群里大佬说这个Referer搞得也太假了,我一看Referer是什么东西,之前也没听说过呀,赶紧百度了一圈。
Referer是啥
Referer
请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer
请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。举个栗子,就好比你在www.baidu.com 中点了某一个链接跳转到了目标页面,那么跳转到目标页面时http请求的head头里面Referer就是www.baidu.com ,如下图所示:
有以下几种情况referer字段为空:
- 浏览器地址栏直接输入url访问
- 点击浏览器收藏夹直接访问
- 浏览器设置关闭携带referer信息
- 服务端curl不带referer头时
Referer作用
- 跟踪用户访问信息
- 比如只在本站内才展示的资源,可以通过
Referer
字段验证是否是站内打开的,用来做校验,当然这种校验是不准确的,因为http的head头信息可以通过curl随意修改。
控制Referer
有些情况我们不想带上Referer头,比如内网 URL,不希望外部用户知道内网有这样的地址。Referer
字段很可能把这些 URL 暴露出去。这时我们想自己控制Referer
展示信息。有一下几种方式控制:
rel="noreferrer"
在html标签上通过添加rel="noreferrer"属性来阻止http请求带有Referer
信息。如下所示:
<a href="http://www.baidu.com" rel="noreferrer" target="_blank">baidu</a>
Referrer Policy
rel
属性只能定制单个元素的Referer
行为,只能选择发送或不发送。所以前端html增加了更强大的Referrer Policy。该属性使用方法如下所示:
- HTTP 头信息
Referrer-Policy: origin
<meta>
标签
<meta name="referrer" content="origin">
referrerpolicy
属性
<a href="..." referrerpolicy="origin" target="_blank">...</a>
该属性的值有如下几种:
- no-referrer (不发送
Referer
字段) - no-referrer-when-downgrade (如果从 HTTPS 网址链接到 HTTP 网址,则不发送
Referer
字段) - same-origin (链接到同源网址(协议+域名+端口 都相同)时发送,否则不发送。)
- origin (
Referer
字段一律只发送源信息(协议+域名+端口),不管是否跨域。) - strict-origin (如果从 HTTPS 网址链接到 HTTP 网址,不发送
Referer
字段,其他情况只发送源信息。) - origin-when-cross-origin (同源时,发送完整的
Referer
字段,跨域时发送源信息。) - strict-origin-when-cross-origin (同源时,发送完整的
Referer
字段;跨域时,如果 HTTPS 网址链接到 HTTP 网址,不发送Referer
字段,否则发送源信息。) - unsafe-url (
Referer
字段包含源信息、路径和查询字符串,不包含锚点、用户名和密码。)
页面重定向
通过页面重定向的方式来隐藏掉referer信息。先跳转到指定页面,页面参数是真正需要跳转的链接,在后端获取到真正需要跳转的链接后做重定向。这种方式不需要前端修改,后端也只需要写一个重定向接口即可,这是比较好的一种实践方式。如下所示:
<a href="/reload?url=http%3A%2F%2www.baidu.com">baidu.com</a>