Nginx-基础篇-6【防盗链】
本文最后更新于 2023-09-19,文章内容可能已经过时。
1. 防盗链
1.1. 基本使用
当我们通过浏览器访问后端项目,其实页面内联的css或者js等静态文件,是通过浏览器接受到返回来的请求后又发送的第二次http请求获得的,这次的请求头还有refer
字段,利用这个字段,就可以起到判断是否来自于同一个站点。

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
- 感谢你赐予我前进的力量