Nginx可通过valid_referers配合if校验Referer实现静态资源防盗链,需配置白名单(none、blocked、域名、通配符、正则),对图片/CSS/JS等资源精准拦截并返回403或重定向,避免误伤HTML及favicon.ico等。

要防止 HTML 静态资源(如图片、CSS、JS、字体等)被其他网站盗用,Nginx 可通过 valid_referers 指令配合 if 判断实现来源校验,并返回 403 或重定向到默认资源。关键不是“禁止所有外链”,而是精准识别合法来源并拒绝非法引用。
配置 valid_referers 白名单来源
在 server 或 location 块中定义允许的 Referer 值。支持域名、正则、通配符和空 Referer(直接访问或浏览器隐私模式):
-
none:允许无 Referer 请求(如用户直接输入 URL、HTTPS 页面加载 HTTP 资源被浏览器清除 Referer) -
blocked:允许被防火墙/代理 stripped 的 Referer(仅含协议+域名,无路径参数) - 具体域名:
www.example.com、example.com(注意不带http://) - 通配符:
*.example.com(匹配子域) - 正则:
~* \.example\.(com|org)(~*表示忽略大小写)
拦截非法 Referer 并返回合适响应
定义白名单后,用 if 判断 $invalid_referer 变量(为 1 表示不匹配任何合法来源),再决定如何处理:
- 直接返回 403:
return 403;(最常用,简洁明确) - 重定向到占位图:
rewrite ^/.*\.(jpg|jpeg|png|gif)$ /images/forbidden.png break;(需确保该路径可公开访问) - 记录日志便于分析:
log_not_found off;配合自定义日志格式,单独标记盗链请求
注意:if 在 location 中使用是安全的,但避免在 server 级别大量嵌套 if,也勿对整个 root 做 Referer 校验——HTML 文件本身通常需要允许直接访问,防盗链应聚焦于静态资源目录(如 /static/、/images/)。
立即学习“前端免费学习笔记(深入)”;
针对不同资源类型精细化控制
不要一刀切。HTML 页面本身一般不应限制 Referer(否则搜索引擎快照、微信内嵌页可能异常),而图片、字体、API JSON 等可严格校验:
- 对图片/CSS/JS:
location ~* \.(jpg|jpeg|png|gif|css|js|woff2?|ttf|eot)$ { ... } - 对特定目录(如上传资源):
location ^~ /uploads/ { ... } - 排除 favicon.ico 和 robots.txt:
location = /favicon.ico { log_not_found off; access_log off; }
还可结合 map 指令预计算 Referer 合法性,提升性能(尤其高并发时)。
测试与常见问题排查
配置后务必验证,推荐方式:
- 用 curl 模拟不同 Referer:
curl -H "Referer: https://evil.com" https://yoursite.com/images/test.jpg - 在 Chrome 开发者工具 Network 面板中右键“Open in new tab”,观察 Referer 是否被清空(此时应允许
none) - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log,确认无invalid referer相关警告
典型问题:HTTPS 页面引用 HTTP 资源 → 浏览器自动清 Referer → 必须包含 none;CDN 或反向代理透传 Referer 失败 → 检查 upstream 是否设置了 proxy_set_header Referer $http_referer;。











