首页 > 技术分享 > LNMP|WAMP
收藏

Nginx通过Referer配置防盗链

12/17 20:22
大潇博客 原创文章,转载请标明出处

划重点:

在需要防盗链的location中配置:

valid_referers 192.168.215.100;

if ($invalid_referer) {

return 403;

}

具体到配置文件中,如图:

Nginx配置防盗链.png



Referer的原理:

直接访问一个网址时,浏览器的Request header(请求标头)中没有Referer

此时点击页面中的某个链接,跳转打开新页面,这时请求头就会带上Referer,值为跳转前页面的链接


打开网页就会发生多次请求

比如访问某个html网页,页面内会引入一些其它资源,如css、js、image等,这些资源并不是和html页面同时被加载,而是拿到页面文件后,在html的骨架里被再次访问

打开顺序为:

1、先请求此html

2、二次或多次请求此html页面内引入的css、js、image


当再次发起请求的时候,会在请求的Request header请求标头中,加上referer参数,这是http协议规定,由浏览器来遵守执行的规则

注意:referer在第二次访问的时候才有,表示是从哪个页面过来的,第一次访问的时候没有

包括浏览器下载的时候,也会带referer

Referer参考.png


所以每次看上去虽是直接访问了一个页面,但请求这些被引入的资源文件时,Request header请求标头同样会带上referer



防盗链基本原理:

保存在服务器的资源只能由自己去访问,这个我们称作原始站点。而盗链,是在一台非原始站点的服务器中,通过proxy_pass代理或者html中引用,来内联原始站点资源的行为

要防止资源被盗链,可以通过referer判定这个站点和原始站点是否为同一个站点,如果不是,就判断它为非法请求,说明有网站非法引用了我的资源



配置防盗链:

valid_referers  none | block | server_names | strings...

none, 检测 Referer 头域不存在的情况。

blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以“http://” 或 “https://” 开头。

server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。


注意:防盗链不能直接在server下配,可以配置到任意的location下,说明哪个location不让被访问


下面为实际配置案例

1、比如网站中的静态资源不能被盗链,就要配置到匹配静态资源的location中

location ~* /(css|js|img) {

#写法 检测referers

valid_referers 192.168.214.128; #允许访问的网址或ip

if ($invalid_referer) {

      return 403;  #无效的referer,返回http的403状态码,也可以是404等

}

}

这样配置,使用非原始站点引用时就打不开了,不仅带referer打不开,直接访问也打不开


2、有时候不一定要全部屏蔽,比如可以在非法引用时打不开,直接访问能打开,在验证referer时增加“none”

location ~* /(css|js|img) {

#写法 检测referers

valid_referers none 192.168.214.128;  #允许访问的网址或ip

if ($invalid_referer) {

      return 404;  #无效的referer,返回http的404状态码,也可以是403、405等

}

}


3、配置多个合法网址或域名,包含通配符匹配

location ~* /(css|js|img) {

#写法 检测referers

valid_referers none 192.168.214.128 192.168.214.129 www.example.com *.domain.com; #允许访问的网址或ip

if ($invalid_referer) {

      return 405;  #无效的referer,返回http的405状态码

}

}


4、非法引用时,跳转提示页面

location ~* /(css|js|img) {

#写法 检测referers

valid_referers none 192.168.214.128 192.168.214.129 #允许访问的网址或ip

if ($invalid_referer) {

      return 406; #无效的referer,返回http的406状态码

}

}

error_page 406 /406.html;  #状态为406时要访问的页面

location = /406.html {

#406页面的根目录,下面三种方式均可以

root html;  #root后面不加斜线,表示基于nginx根目录开始

root html/page;  #root后面不加斜线,表示基于nginx根目录开始

root /usr/local/nginx/html/page;  #基于linux根目录

root /usr/local;  #基于linux根目录,且不在nginx目录内

}


5、非法引用时,使用Urlrewrite跳转提示图片

location ~* /(css|js|img) {

#写法 检测referers

valid_referers none www.example.com *.domain.com; #允许访问的网址或ip

if ($invalid_referer) {

      rewrite ^/ /406.jpg break;  #非法引用时跳转提示图片,“^/”为匹配目标所有,后面图片的路径基于nginx根目录

      #rewrite ^/ http://www.example.com;  #非法引用时跳转网址

}

}


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311