html访问图片资源403问题(http referrer)
2024-09-26 11:28:29
前言
之前碰到一个问题,就是html中通过img标签引入一个图片地址,报403。但是这个图片地址直接复制出来在地址栏打开,却是看得到的。
- 先说下解决方法: 在HTML代码的head中添加一句
<meta name="referrer" content="no-referrer" />
即可,后面再说下原理。
http请求中的referrer
http请求体的header中有一个referrer字段,用来表示发起http请求的源地址信息,这个referrer信息是可以省略但是不可修改的,就是说你只能设置是否带上这个referrer信息,不能定制referrer里面的值。
服务器端在拿到这个referrer值后就可以进行相关的处理,比如图片资源,可以通过referrer值判断请求是否来自本站,若不是则返回403或者重定向返回其他信息,从而实现图片的防盗链。上面出现403就是因为,请求的是别人服务器上的资源,但把自己的referrer信息带过去了,被对方服务器拦截返回了403。
在前端可以通过meta来设置referrer policy(来源策略),具体可以设置哪些值以及对应的结果参考这里。所以针对上面的403情况的解决方法,就是把referrer设置成
no-referrer
,这样发送请求不会带上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)时会带上这个参数,他用来表示发起请求的服务器地址,这个参数是必定会传的,然后服务器端用此字段来判断是否允许跨域。
作者:ITgecko
链接:https://www.jianshu.com/p/56df73d0d128
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
最新文章
- 1.JAVA之GUI编程概述
- Xcode快捷键大全
- Mongodb3.0.6副本集+分片学习笔记
- 开年钜献:华清远见金牌讲师名家大讲堂(Android开发篇)
- 开发ERP软件应该遵守的22条规则
- UVA 10537 The Toll! Revisited 过路费(最短路,经典变形)
- python 循环使用 while 或 for 语句实现用户名密码输错三次退出
- 关于QQ空间相册功能的构想与简单实现
- tomcat启动报错:Address already in use: JVM_Bind
- adb devices 找不到设备
- jQuery传参
- 《Android进阶之光》--View体系与自定义View
- java用毫秒数做日期计算的一个踩坑记录
- WDA基础九:BusinessGraphics
- php 页面调转导致session丢失解决方法
- C++模板编程中只特化模板类的一个成员函数
- Broken pipe错误原因
- Linux嵌入式内核模块程序设计
- zeromq 笔记
- OEM SLP Key
热门文章
- 关于MySql升级JDBC架包导致时区问题报错(The server time zone value &#39;?й???????&#39; is unrecognized or represents more than one time zone)
- Python基础Day1—下
- oracle 删除表空间
- k8s 如何支持私有镜像
- 使用Cloudera Manager搭建YARN集群及YARN HA
- systemctl 常用操作
- 用java刷剑指offer(数字在排序数组中出现的次数)
- linux网络编程之socket编程(三)
- spark如何划分DAG视图
- memorization-根据输入重新计算render的数据