img标签访问图片403(http referrer),直接访问图片链接可以打开

3 篇文章 0 订阅
2 篇文章 0 订阅

先说下解决方法:

  1. 在HTML代码的head中添加一句,

    <meta name="referrer" content="no-referrer" />
    

    另外除了全局mate标签外也可以
    a标签的referrer

    <a href="http://example.com" referrer="no-referrer|origin|unsafe-url">xxx</a>
    

    img/image标签的referrer

    
    <img referrer="no-referrer|origin|unsafe-url" src="{{item.src}}"/>
    <image referrer="no-referrer|origin|unsafe-url" src="{{item.src}}"></image>
    
    

后面再说下原理。

http请求中的referrer
http请求体的header中有一个referrer字段,用来表示发起http请求的源地址信息,这个referrer信息是可以省略但是不可修改的,就是说你只能设置是否带上这个referrer信息,不能定制referrer里面的值。

服务器端在拿到这个referrer值后就可以进行相关的处理,比如图片资源,可以通过referrer值判断请求是否来自本站,若不是则返回403或者重定向返回其他信息,从而实现图片的防盗链。上面出现403就是因为,请求的是别人服务器上的资源,但把自己的referrer信息带过去了,被对方服务器拦截返回了403。

在前端可以通过meta来设置referrer policy(来源策略),具体可以设置哪些值以及对应的结果参考这里。所以针对上面的403情况的解决方法,就是把referrer设置成no-referrer,这样发送请求不会带上referrer信息,对方服务器也就无法拦截了。
在这里插入图片描述
浏览器中referrer默认的值是no-referrer-when-downgrade,就是除了降级请求的情况以外都会带上referrer信息。降级请求是指https协议的地址去请求http协议,所以上面403的情况还有另一种解决方法就是,请求的图片地址换成http协议,自己的地址使用http协议,这样降级请求也不会带上referrer。

nginx配置图片防盗链

最后再说一下这种根据referrer拦截,在服务器如何配置。我自己服务器用的nginx,这里就说下nginx的配置。首先打开nginx的配置文件:conf/nginx.conf,在server下面添加如下:

 location ~* \.(gif|jpg|png|jpeg)$ {
       valid_referers none  valid.url.com;
       if ($invalid_referer) {
               return 403;
       }
 }

首先第一句以文件格式后缀匹配出图片资源路径,然后通过valid_referers添加合法的referer地址,加上none,表示没有传referer也是合法的,最后referer不合法的情况返回403。如果想跳其他地址或返回其他图片资源可以这样:rewrite xxx.xxx.com/xxx.jpg。

orgin

http头部中还有一个与referrer类似的叫orgin的字段,在发送跨域请求或预检请求(preflight request)时会带上这个参数,他用来表示发起请求的服务器地址,这个参数是必定会传的,然后服务器端用此字段来判断是否允许跨域。

referrer的几种状态

在这里插入图片描述

方法二: 代理图片

(不支持gif图片,使用第一种方案是没有gif效果的,只能显示静态图片.)
使用images.weserv.nl方案
小程序

getImage(url){
	console.log(url);
	// 把现在的图片连接传进来,返回一个不受限制的路径
	if(url !== undefined){
		return url.replace(/^(http)[s]*(\:\/\/)/,'https://images.weserv.nl/?url=');
	}
}

把图片路径直接传进去,替换一下原来url的http/https.或者直接在图片url前加上https://images.weserv.nl/?url=
如:

https://images.weserv.nl/?url=https://xxx.com/name.jpg

原图片的http://是可以省略的(与上面的getImage函数是一样的结果)

https://images.weserv.nl/?url=xxx.com/name.jpg
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值