先说一下含义,就是想让nginx里的静态资源只供它反向代理连接的内部服务器去访问,其他人想访问,就不给。比如01虚拟机充当nginx服务器,它里面存了很多静态资源,04虚拟机proxy_pass到01虚拟机,想访问它的页面,01虚拟机不想让你通过这种方式拿到我的静态资源,于是可以设置防盗链。举个例子,我proxy_pass到尚硅谷的主页,肯定要访问它的域名背后的nginx服务器,正常来说该服务器保存了很多静态资源,然后该nginx去将本次访问的任务分配给某个内部服务器。如果nginx服务器设置了防盗链,那么我proxy_pass拿到的尚硅谷的主页将无法获取静态资源,看不到图片,css失效,js失效等等。
server {listen 82;listen [::]:82;#root /var/www/web/index;#index index.html;server_name localhost;location / {proxy_pass http://192.168.125.129:8080/demo/views/login.html;#try_files $uri $uri/ =404;}location ~*/(js|img|css|layui|assembly) {valid_referers 192.168.xxx.xxx;if ($invalid_referer) {return 403;}root /var/www/web ;index index.html index.htm;}
}
valid_referers 192.168.xxx.xxx;此处是01虚拟机的ip,这里valid_referers匹配的是网址,带有这个ip的网址,都会触发valid_referers。防盗链的实现是通过referer检测的,大致的原理是正常的浏览器会在资源第二次访问时提供referer地址,也就是访问者的来源。
所谓第二次访问,其实当你访问某个网址的时候,先加载这个,

可以看到是没有referer的,因为算作第一次访问,但是后面紧跟的静态资源的请求就不是第一次了,而是多次了,此时就带有referer了:

这里如果发现访问者的地址不包含本机ip,那就认为是外部访问,就不符合valid,触发,返回403。


valid_referers none 192.168.xxx.xxx;
效果:
虽然右键图片,在新的页面打开是带有referer的,但是复制该图片地址,新建标签粘贴地址,此时的页面是不带referer的,可以看到

下面没有referer,访问成功了,代表放行了。估计下载接口也是这么做的,复制下载链接到标签页访问可以拿到资源,但是用proxy_pass这种带有referer的则会失效。
server {listen 82;listen [::]:82;#root /var/www/web/index;#index index.html;server_name localhost;location / {proxy_pass http://192.168.yyy.yyy:8080/demo/views/login.html;#try_files $uri $uri/ =404;}location ~*/(js|img|css|layui|assembly) {valid_referers none 192.168.xxx.xxx;if ($invalid_referer) {return 403;}root /var/www/web ;index index.html index.htm;}error_page 403 /403.html;location = /403.html {root /var/www/error;}
}
效果:右键图片,新标签打开

中文乱码了,原html里面写的是非法请求~,乱码也无所谓,意思到了。
上一篇:以"分"开头的成语接龙
下一篇:俊秀能用于女人吗俊秀与清秀差别