Nginx配置HTML静态资源防盗链与来源校验

1次阅读

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

Nginx配置HTML静态资源防盗链与来源校验

要防止 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.comexample.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;

text=ZqhQzanResources