nginx防盗链需结合location后缀匹配与valid_referers referer校验,仅后缀拦截无效;推荐用区分大小写的正则location ~*.(jpg|jpeg|png|gif|webp|mp4|avi|css|js|woff2?)$配合valid_referers none blocked server_names *.example.com example.com及if ($invalid_referer) { return 403; }实现。

Nginx 可以通过 location 段匹配文件后缀,结合 valid_referers 和 if 判断来实现基础防盗链,但要注意:仅靠后缀拦截不等于完整防盗链,必须配合 Referer 校验才有效。
用 location 匹配敏感后缀
把图片、视频、CSS、JS 等易被盗用的静态资源归类,用 location 精确匹配后缀:
- 推荐写法(区分大小写,更严谨):
location ~* \.(jpg|jpeg|png|gif|webp|mp4|avi|css|js|woff2?)$ { ... } - 避免写成
location /static/这类路径前缀,它不校验后缀,容易误放或漏拦 - 正则末尾加
$防止匹配到类似logo.jpg?v=123中的参数干扰
结合 valid_referers 做 Referer 白名单
valid_referers 必须放在 location 内或 server 级,定义哪些来源允许访问:
- 常见配置示例:
valid_referers none blocked server_names *.example.com example.com; -
none:直接输入 URL 访问(如浏览器地址栏敲入)blocked:Referer 被防火墙或隐私插件清空的情况server_names:指定域名及子域(支持通配符) - 注意:空 Referer 默认不被允许,除非显式写上
none
用 if 判断并拒绝非法请求
在同一个 location 块中使用 if 检查 $invalid_referer 变量:
- 标准拦截写法:
if ($invalid_referer) { return 403; } - 也可返回自定义提示图(需确保该图本身不被防盗链):
if ($invalid_referer) { rewrite ^/.*$ /images/forbidden.png break; } - ⚠️ 注意:
if在 location 中是安全的,但不要在 server 或 http 级滥用
补充建议与避坑点
防盗链不是一劳永逸,需兼顾可用性与防护强度:
- API 接口、HTML 页面一般不设 Referer 限制,否则影响 SEO 和正常跳转
- 移动端 App 或小程序可能不带 Referer,需额外通过 token 或 UA + IP 限流辅助识别
- 测试时用 curl 模拟盗链:
curl -H "Referer: https://evil.com" https://yoursite.com/logo.png - 开启日志记录非法请求,方便分析绕过行为:
log_format referer_blocked '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';










