nginx对html目录下图片防盗链的核心是按路径(如location ^~ /img/)或文件类型(如location ~ .(jpg|png|gif)$)匹配请求,并通过valid_referers none blocked .yourdomain.com yourdomain.com校验referer合法性,非法请求返回403。

Nginx 对 html 目录下的图片做防盗链,核心是按路径或文件类型拦截请求,并校验 Referer 是否合法。不需要移动图片位置,直接在配置中精准控制即可。
针对 html 目录下图片的防盗链配置
假设你的 Nginx 站点根目录是 root /usr/local/nginx/html;,图片放在 html/img/ 或 html/uploads/ 等子目录里(比如 /usr/local/nginx/html/img/test.png),你可以用两种方式之一实现防盗链:
-
方式一:按目录匹配(推荐用于集中存放图片的场景)
比如所有图片都在/html/img/下:location ^~ /img/ { valid_referers none blocked *.yourdomain.com yourdomain.com; if ($invalid_referer) { return 403; } # 保持原有访问能力(如索引、缓存等可继续加) expires 30d; add_header Cache-Control "public, immutable"; }✅ 注意:
^~ /img/表示优先匹配以/img/开头的 URI,比正则更高效;root由外层server或location /继承,无需重复写。 -
方式二:按文件扩展名匹配(适合图片散落在 html 各子目录)
比如html/banner.jpg、html/blog/pic.png都要保护:location ~* \.(jpg|jpeg|png|gif|bmp|webp|ico|svg)$ { valid_referers none blocked *.yourdomain.com yourdomain.com; if ($invalid_referer) { return 403; } expires 7d; add_header Vary Accept-Encoding; }✅
~*表示不区分大小写的正则匹配;该规则会拦截所有匹配后缀的请求,无论它们在html下哪一层路径。
白名单域名怎么写才有效?
valid_referers 支持这些写法(必须写全,注意协议无关):
-
none:允许直接在浏览器地址栏输入图片 URL 访问(如http://site.com/img/x.png) -
blocked:允许 Referer 被代理、隐私模式或防火墙清空的情况(常见于移动端或某些浏览器) -
yourdomain.com:精确匹配主域名(不含 www) -
*.yourdomain.com:匹配所有一级子域名(如blog.yourdomain.com、cdn.yourdomain.com) -
~\.yourdomain\.com$:正则写法,更严谨(防attackyourdomain.com这类碰瓷)
⚠️ 不支持 http:// 或 https:// 前缀 —— valid_referers 只比对域名部分。
验证是否生效的小技巧
- 本地浏览器直接打开图片链接 → 应返回 200(因
none允许) - 用 curl 模拟盗链:
curl -H "Referer: https://baidu.com" http://yourdomain.com/img/test.png # 应返回 403 Forbidden
- 查看 Nginx access.log,确认
$http_referer字段和状态码是否符合预期(建议日志格式含"$http_referer")
不复杂但容易忽略
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











