nginx配置防盗链入门
什么是“防盗链”?
• 盗链:别人不经过你的网站,直接在他们的网站或 App 里引用你服务器上的图片、视频、文件资源。
• 例如:你的网站 img.example.com/logo.png,被别的网站 <img src="http://img.example.com/logo.png"> 调用。
• 结果是 别人省了流量,损耗却在你这边(带宽被占,服务器压力大)。
• 防盗链:通过技术手段限制资源访问,只允许 合法来源(Referer 正确) 的请求获取文件,非法来源的请求返回 403 Forbidden 或替代图片。
为什么要用在 Nginx?
Nginx 经常用来做 静态资源服务器 / 反向代理 / CDN 边缘节点。
为了节省带宽和保护资源,Nginx 提供了 Referer 校验 和 签名 URL(secure_link 模块) 来实现防盗链。
本机环境测试
配置先实现动静分离:
- 本机(172.20.10.10:8080) 跑一个web程序, 但是静态资源入css,img不部署在这个服务器上
-
从本地访问这个页面, css和img 找不到很正常, 而且真实情况下, 连这个页面也访问不了, 而是通过反向代理 代理到这个页面
-
172.16.246.201这个机子放静态资源,实现动静分离
配置核心配置文件(只实现动静分离不配置防盗链)
server {listen 80;server_name localhost;location / {proxy_pass http://172.20.10.10:8080;}location ~*/(css|img) {root /usr/share/nginx;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
-
解释: 当请求路径以 /css 或 /img 开头(不区分大小写)时,就从 /usr/share/nginx 目录下读取对应的文件。
-
location 前缀
/ | 通用匹配,任何请求都会匹配到 |
---|---|
= | 精准匹配,不是以指定模式开头 |
~ | 正则匹配,区分大小写 |
~* | 正则匹配,不区分大小写 |
^~ | 非正则匹配,匹配以指定模式开头的location |
- location匹配顺序
多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
配置成功后,通过反向代理的方式访问172.16.246.201
配置防盗链
防盗链配置valid_referers none | blocked | server_names | strings ....;
none, 检测 Referer 头域不存在的情况。
blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。
server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
引入
返回状态码的防盗链
此配置为:允许 referer 为172.16.246.201 或者不携带 referer
server {listen 80;server_name localhost;location / {proxy_pass http://172.20.10.10:8080;}location ~*/(css|img) {root /usr/share/nginx;valid_referers none 172.16.246.201;if ($invalid_referer){return 403;}}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
测试 在开一个172.16.246.202, 反向代理到172.16.246.201 这个服务器
server {listen 80;server_name localhost;location / {proxy_pass http://172.16.246.201;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
返回图片的防盗链
server {listen 80;server_name localhost;location / {proxy_pass http://172.20.10.10:8080;}location ~*/(css|img) {root /usr/share/nginx;valid_referers none 172.16.246.201;if ($invalid_referer){return 403;}}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}error_page 403 /403.png;location =/403.png{root /usr/share/nginx/img;}
}
盗用资源就会重定向到自己定义的图片
用curl命令测试, 可以携带自定义的 referer
curl -I -e "http://exaple.com" http://target.com
-I : 只返回头信息
-e : 指定携带的referer