前言

  • 之前碰到一个问题,就是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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

html访问图片资源403问题(http referrer)的更多相关文章

  1. nginx 访问目录403

    centos7.2默认安装好nginx后,会在/usr/share/nginx/html下作为主目录 但是如果想访问下面的目录会发现没有权限,返回403错误 这时候要注意在/etc/nginx/ngi ...

  2. 启动 apache2.4 出现 invalid command order 问题 【由于 PHP 访问权限 403 问题引起】

    由于网站出现  403 禁止访问,所以修改了 httpd.conf 文件的权限如下 <Directory /> Options FollowSymLinks AllowOverride N ...

  3. ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)

    在ASP.NET MVC4中微软引入了bundles特性,这个特性可以将服务器端的多个Javascript或多个css文件捆绑在一起作为一个单一的URL地址供客户端浏览器调用,从而减少了页面上Http ...

  4. nginx静态资源文件无法访问,403 forbidden错误

    在安装 nginx 服务器后,我想把网站的根目录设置为 /root/www/ ,于是对 nginx 的 nginx.conf 文件进行配置 先打开 nginx.conf #user nobody; w ...

  5. WampServer 2.5设置外网访问/局域网手机访问(403 Forbidden错误解决方法)

    安装好wamp后,想用手机通过局域访问电脑上wamp下的网页,结果出现如下提示. (403 Forbidden)错误 1.打开http.conf文件 2.找到下图中红色方框中的onlineofflin ...

  6. apache 访问出现403 Forbidden

    在linux虚拟机的apache上新增一个虚拟目录/var/wordpress,想把理论网挂上去. 在配置文件httpd.conf中,把”Include conf/extra/httpd-vhosts ...

  7. Nginx internal 指令限制访问图片资源文件

    Nginx 的 internal 指令可以用来限制 Web 公共目录下的图片等资源文件被任意用户直接访问.一个明显的使用场景是,对于用户上传的认证图片,属于个人隐私资源,不应该让所有用户都能访问得到, ...

  8. nginx1.15.10配置使用非https访问返回403

    nginx版本号:nginx version: nginx/1.15.10 server { listen 443 default ssl; server_name app.test.com; if ...

  9. Django项目报错: 禁止访问(403),CSRF验证失败,相应中断

    如果想要取消表单的CSRF防护,可以在模板上删除{% csrf_token %}, 并且在相应的视图函数中添加装饰器@csrf_exempt, 代码如下: from django.views.deco ...

随机推荐

  1. Mac下iTerm2配置lrzsz功能

    Mac下iTerm2配置lrzsz功能 rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具. 优点就是不用再开一个sftp工具登录上去上传下载文件. 近期在mac上通 ...

  2. Visio 撤销按钮无法使用 菜单显示:无法撤销

    首先是借鉴地址:https://answers.microsoft.com/en-us/msoffice/forum/msoffice_visio-mso_other-mso_2007/visio-o ...

  3. DNS BIND配置 配置基本缓存服务器 DNS正向解析 DNS反向解析

    一. 缓存服务器配置 1.DNS:BIND    Berkeley Internet Name Domain    版本bind97: RPM服务器端包的名字  安装bind-libs    bind ...

  4. sqlite3中给表添加列

    1.修改表名为临时表 ALTER TABLE {tableName} RENAME TO TempOldTable; 2.创建新表,跟原来的表名一致 CREATE TABLE {tableName} ...

  5. django 学习第二天

    今日内容 一.Django MVC和MTV框架 MVC controller:路由分发 用urls里面放置不同路径 执行不同函数 model 数据库信xi view #views 逻辑相关里面,写函数 ...

  6. Greenplum 激活standby 和恢复 master 原有角色

    当Greenplum segment的primary出现问题时,FTS会监测到,GP会自动激活mirror.但是对于GP的master节点,虽然有standby,但是GP并不会自动来完成master和 ...

  7. Base64原理解析与使用

    一.Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送.这样用途就受到了很大的 ...

  8. cube.js 学习(三)cube.js data schema

    cube.js的 data schema 类似graphql 的type 定义,但是cube.js 的data schema 更偏向于dsl, 其中抽象了进行数据分析应用开发中的东西,自己提炼了mea ...

  9. WAMP 403 Forbidden禁止访问,别的电脑访问不了;

    直接上图: 1:修改httpd.conf; deny from all 改成------ allow from all 重启服务就好了: 2:如果搜不到deny from all 就按照下面的方法来 ...

  10. C语言for 循环 9*9 实现九九乘法表

    #include <stdio.h> int main(void) { //for循环实现9*9乘法表 /* 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 */ ...