本文最后更新于 2023-09-19,文章内容可能已经过时。

1. 防盗链

1.1. 基本使用

当我们通过浏览器访问后端项目,其实页面内联的css或者js等静态文件,是通过浏览器接受到返回来的请求后又发送的第二次http请求获得的,这次的请求头还有refer字段,利用这个字段,就可以起到判断是否来自于同一个站点。

15 防盗链.png

valid_referers none | blocked | server_names | strings …;

  • none, 检测 Referer 头域不存在的情况。如果没有referers 就允许访问。

  • blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以“http://” 或 “https://” 开头。配置了这个不带也能访问。

  • server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。生产环境配的是域名不是IP,我们这里用虚拟机所以使用的ip地址做示例。

这里举个例子,如我们通过网关服务器100反向代理到后端101的项目,而另一个服务器102通过反向代理访问网关服务器100,来模拟直接访问100网关服务器,以及通过服务器102间接访问服务器100,我们需要在网关服务器100处【需要防盗链的location中配置】

注意这里的 if 和 ( 之间必须有个空格;常用:return 200 "要返回的文字"

location ~*/(css|img|js) {
	valid_referers 192.168.110.100;
    if ($invalid_referer) {
    return 403;
	}
	 root /usr/local/nginx/static;
     index index.html index.htm;
}

如果想要完成一个自定义的错误页的返回,只需要自己更改配置文件并创建对应http状态码的html文件。

	upstream httpds {
        server 192.168.44.102 weight=8 down;
        server 192.168.44.103:8080 weight=2;
        server 192.168.44.104:8080 weight=1 backup;
	}

	server {
        listen       80;
        server_name  www.fanxy.cloud;

        location / {
            rewrite ^/*([0-9]+).html$ /index.jsp?pageNum=$1 break;
            proxy_pass http://httptest;
        }
        
        location ~*/(css|img|js) {
            valid_referers 192.168.110.100;
            if ($invalid_referer) {
            return 401;
		}
	 		root /usr/local/nginx/static;
     		index index.html index.htm;
		}
		
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        error_page   401    /401.html;
        location = /401.html {
        	root   html;
        }
	}              

如果想要完成显示自定义的错误图片,可以在防盗链上结合rewrite,这里把所有以/开头的请求都匹配了,而所有的请求肯定都以/开头。我们只需要在对应后面替换的请求位置放上我们的自定义图片即可

        location ~*/(css|img|js) {
            valid_referers 192.168.110.100;
            if ($invalid_referer) {
            rewrite ^/      /img/x.png break;
            # return 401;
		}

1.2. 使用curl测试

如果没有这个软件需要进行下载

yum install -y curl

参数 : -I 可以在服务器端,直接通过命令查看访问一个ip所返回的头信息,不加这个参数返回的是完整信息

curl -I http://192.168.44.101/img/logo.png

带引用:即自定义是从哪个站点跳转过来的,自定义前面的refer头域

curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png