先说一下含义,就是想让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里面写的是非法请求~,乱码也无所谓,意思到了。