前言

  • 之前碰到一个问题,就是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. 1.JAVA之GUI编程概述
  2. Xcode快捷键大全
  3. Mongodb3.0.6副本集+分片学习笔记
  4. 开年钜献:华清远见金牌讲师名家大讲堂(Android开发篇)
  5. 开发ERP软件应该遵守的22条规则
  6. UVA 10537 The Toll! Revisited 过路费(最短路,经典变形)
  7. python 循环使用 while 或 for 语句实现用户名密码输错三次退出
  8. 关于QQ空间相册功能的构想与简单实现
  9. tomcat启动报错:Address already in use: JVM_Bind
  10. adb devices 找不到设备
  11. jQuery传参
  12. 《Android进阶之光》--View体系与自定义View
  13. java用毫秒数做日期计算的一个踩坑记录
  14. WDA基础九:BusinessGraphics
  15. php 页面调转导致session丢失解决方法
  16. C++模板编程中只特化模板类的一个成员函数
  17. Broken pipe错误原因
  18. Linux嵌入式内核模块程序设计
  19. zeromq 笔记
  20. OEM SLP Key

热门文章

  1. 关于MySql升级JDBC架包导致时区问题报错(The server time zone value &#39;?й???????&#39; is unrecognized or represents more than one time zone)
  2. Python基础Day1—下
  3. oracle 删除表空间
  4. k8s 如何支持私有镜像
  5. 使用Cloudera Manager搭建YARN集群及YARN HA
  6. systemctl 常用操作
  7. 用java刷剑指offer(数字在排序数组中出现的次数)
  8. linux网络编程之socket编程(三)
  9. spark如何划分DAG视图
  10. memorization-根据输入重新计算render的数据