限制非法引用的核心是用 valid_referers 定义合法来源,再通过 if ($invalid_referer) 拦截不匹配请求;必须限定在静态资源 location 块中,精准匹配后缀或路径,白名单需包含 none、blocked 及所有真实来源域名,拦截时推荐 return 403。

限制非法引用的核心是:用 valid_referers 定义合法来源,再通过 if ($invalid_referer) 拦截不匹配的请求。关键不是“禁止谁”,而是“只放行谁”——白名单思维更安全、更可控。
明确作用范围:只对静态资源生效
防盗链逻辑必须限定在图片、CSS、JS 等静态文件的 location 块中,避免误伤 HTML 页面或 API 接口:
- 用正则精准匹配后缀,例如:
location ~* \.(jpg|jpeg|png|gif|css|js|woff2|svg)$ - 不要写成
location /或泛用location ~ .*,否则所有请求都受 Referer 校验影响 - 如果资源放在子目录(如
/static/),建议按路径单独配置:location /static/ { ... }
设置 Referer 白名单:覆盖真实访问场景
valid_referers 的值就是你的“允许名单”,必须包含所有合理来源,否则用户直接访问图片也会被拦:
- none:允许无 Referer 请求(如用户直接在地址栏输入图片 URL、书签访问、某些隐私模式)
- blocked:允许 Referer 存在但被代理/防火墙清空的情况(如部分企业内网、iOS Safari 隐私浏览)
- yourdomain.com:主站域名(注意不含 www)
- www.yourdomain.com:带 www 的变体
- *.yourdomain.com:通配所有子域名(如 blog.yourdomain.com、cdn.yourdomain.com)
- ~\.partner\.org$:用正则匹配合作方域名(点号要转义,结尾加 $ 防止子串误匹配)
拦截并返回合适响应
匹配失败时,$invalid_referer 为 1,此时可选择:
-
直接拒绝(推荐初用):
return 403;—— 简洁明确,日志易排查 -
重定向到提示图:
rewrite ^/.*\.(jpg|png|gif)$ /images/forbidden.png break;—— 注意路径需真实存在且可被访问 -
返回自定义页面:
rewrite ^/.*$ /forbidden.html last;—— 需确保该 HTML 不在防盗链规则内,否则循环跳转
验证与避坑要点
配置后务必测试几种典型场景,避免“防住了盗链,也防住了自己”:
- 浏览器直接打开图片 URL(应放行,依赖
none) - 从你自己的网页点击图片链接(Referer 是你的域名,应放行)
- 用 curl 手动伪造 Referer:
curl -H "Referer: https://bad-site.com" https://yoursite.com/test.jpg(应返回 403) - 检查 Nginx 错误日志,确认拦截是否触发,避免语法错误导致整段配置失效
- 别删掉
none—— 否则微信内嵌浏览器、部分 App WebView 可能因 Referer 缺失而加载失败


















