html禁用referer

本文介绍了图片反盗链中取消Referrer头信息的方法。包括在head标签添加meta属性、添加ReferrerPolicy属性、使用rel='norefer'以及代理模式。还对比了不同浏览器对相关方法的支持情况,指出添加meta标签可保证最佳效果,代理模式对小资源友好。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

法1

head标签中添加meta属性,设置name=‘referer’ content=‘never’
referer 的 metedata 参数可以设置为以下几种类型的值:

never
always
origin
default

如果在文档中插入 meta 标签,并且 name 属性的值为 referer,浏览器客户端将按照如下步骤处理这个标签:

1.如果 meta 标签中没有 content 属性,则终止下面所有操作
2.将 content 的值复制给 referrer-policy ,并转换为小写
3.检查 content 的值是否为上面 list 中的一个,如果不是,则将值置为 default

上述步骤之后,浏览器后续发起 http 请求的时候,会按照 content 的值,做出如下反应(下面 referer-policy 的值即 meta 标签中 content 的值):

1.如果 referer-policy 的值为never:删除 http head 中的 referer;
2.如果 referer-policy 的值为default:如果当前页面使用的是 https 协议,而正要加载的资源使用的是普通的 http 协议,则将 http header 中的 referer 置为空;
3.如果 referer-policy 的值为 origin:只发送 origin 部分;
4.如果 referer-policy 的值为 always:不改变http header 中的 referer 的值,注意:这种情况下,如果当前页面使用了 https 协议,而要加载的资源使用的是 http 协议,加载资源的请求头中也会携带 referer。

例子
如果页面中包含了如下 meta 标签,所有从当前页面中发起的请求将不会携带 referer:

<meta name="referrer" content="never">

如果页面中包含了如下 meta 标签,则从当前页面中发起的 http请求将只携带 origin 部分(注:根据原文中的语境,我理解这里的 origin 是包含了 schema 和 hostname 的部分 url,不包含 path 等后面的其他 url 部分),而不是完整的 URL :

<meta name="referrer" content="origin">

注意:在使用本文中所述的 meta 标签的时候,浏览器原有的 referer 策略将被打破,比如从 http 协议的页面跳转到 https 的页面的时候,如果设置了适当的值,也会携带 referer。

tips:

  • 这个标准还是比较老的,而且在他的主页上也明确写了”This document is obsolete.”。不过据我调研,或许正是由于这个标准比较老,反而导致绝大多数浏览器对他的支持都很好,因祸得福蛤蛤。

  • 另外一个是来自MDN的标准。他给meta标签的referrer属性定义了五个值,如果要关闭referrer,就将它的值设置成no-referrer。
    不过我们需要注意的是,meta标签添加的位置也很重要,有的浏览器能够识别非head标签中的meta标签,有的就不行。在实际使用的时候还要小心

法2:添加ReferrerPolicy属性

添加meta标签相当于对文档中的所有链接都取消了referrer,而ReferrerPolicy则更精确的指定了某一个资源的referrer策略。关于这个策略的定义可以参照MDN。比如我想只对某一个图片取消referrer,如下编写即可:

<img src="xxxx.jpg"  referrerPolicy="no-referrer" />
浏览器支持对比

上面我们讲了两种取消referrer头信息的方法,但其实这却对应了五种写法,我们来看下面的对比表:


可以看出Chrome浏览器对各种写法都支持的最好,棒棒哒;Firefox支持所有标准的写法,但是不支持没有写在head标签中的meta标签;Edge/IE则不支持MDN里定义的”no-referrer”配置项,果然是个古董。。。

总的来说,保证最佳效果的最简单的写法就是添加一个meta标签,这样就不用考虑浏览器的差别了,虽然这种写法并不被官方推荐(主要还是要迁就IE这个古董,放弃了理论上更为正确的标准)。

法:3

通过rel=‘norefer’

<iframe src="auto-refresh.html" width="500" height="500" rel="noreferrer"></iframe>
法4:代理模式

把自己的服务器当做代理服务器, 图片请求先经过自己服务器, 修改referer头, 再中转到真正的服务器地址,进行流复制.
  在这里插入图片描述

注: 基于字节流进行传输, 代理服务器做了修改referer, 欺骗后一级服务器.
原本的链接:

<img src="http://www.b.com/xxx/yyy.jpg" />
皆改为如下的格式: http://www.a.com/zzz?source_url=${source_url}

<img src="http://www.a.com/zzz?source_url="http://www.b.com/xxx/yyy.jpg" />

这样他人服务器的防盗链限制就被绕过了, 同时本地服务器又不需要去存储这些资源文件.
这种代理模式, 对图片等小资源友好, 对特大资源(超过10M)并不推荐如此做.

### HTTP Referer 头的用途 HTTP `Referer` 是 HTTP 请求头部的一部分,在客户端发起请求时通常会被自动附加到请求中。它的主要功能是告知接收方当前请求是从哪个 URL 跳转而来的[^3]。通过这个信息,服务器可以实现多种功能: - **流量分析**:网站可以通过记录 `Referer` 的值来了解哪些外部站点链接到了自己的网页,从而评估推广效果或合作伙伴的价值。 - **安全控制**:某些应用利用 `Referer` 来验证请求来源的有效性,防止跨站请求伪造攻击(CSRF)。不过需要注意的是,这种方式并不完全可靠,因为恶意程序可能伪造该字段。 - **用户体验优化**:基于用户的跳转路径提供个性化的内容推荐或者广告展示。 尽管如此,出于隐私保护考虑,现代浏览器允许用户禁用发送 referer 数据的功能;另外,在 HTTPS 到 HTTP 场景下也可能不传递完整的 referrer 信息以减少敏感数据泄露风险[^4]。 ### 配置方式 对于开发者而言,如果希望自定义设置 HTTP 请求中的 `Referer` 值,则需视具体环境采取不同手段: #### 浏览器端手动修改 大多数情况下,普通 HTML 页面加载不会直接暴露更改 header 参数的能力给前端脚本使用。然而借助 JavaScript 和 Fetch API 或 XMLHttpRequest 对象则能够间接达成目的。下面是一个简单的例子演示如何通过 fetch 方法创建带有特定 referer 字段的新请求: ```javascript fetch('https://example.com/target', { method: 'GET', headers: new Headers({ 'Referer': 'https://custom-referer.example/' }) }).then(response => response.text()).then(data => console.log(data)); ``` 值得注意的是,并非所有的浏览器都支持上述操作,而且部分服务端可能会忽略此类人为设定的 referer 取代默认行为产生的真实值。 #### 后台编程语言层面调整 如果是从后台发出对外部资源获取的需求,则几乎每种主流开发框架均提供了相应机制去定制化 outbound requests 中包含的各项参数。例如 Python 下 Requests 库可轻松完成这项任务: ```python import requests headers = {'Referer': 'https://my.custom.referrer/'} response = requests.get('http://external.resource/', headers=headers) print(response.status_code, response.reason) ``` 同样地,在 Java 程序设计里也可以采用类似的思路构建 HttpClient 实例并指定额外属性: ```java HttpClient client = HttpClients.createDefault(); HttpGet request = new HttpGet("http://target.url/"); request.setHeader("Referer", "http://desired.referer/"); try (CloseableHttpResponse httpResponse = (CloseableHttpResponse)client.execute(request)) { System.out.println(httpResponse.getStatusLine()); } catch (IOException e) {} ``` 以上代码片段展示了三种不同的技术栈下如何显式声明 HTTP Request Header 当中的 Referer 属性的方法[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值