Nginx防盗链需在匹配资源的location块中配置valid_referers白名单(含none、blocked、域名),并用if($invalid_referer){return 403;}拦截,避免全局配置与Referer伪造风险。

在 nginx.conf 中配置防盗链,核心是利用 valid_referers 指令校验请求头中的 Referer 字段,只放行可信来源,对非法请求返回 403 或跳转提示页。关键不是堆砌规则,而是放在合适的位置、匹配准确的资源路径、白名单设置合理。
一、明确防护范围:选对 location 块
防盗链应作用于具体静态资源路径,不建议写在 http 或根 location / 下全局生效。推荐按资源类型拆分:
- 保护图片、图标等内嵌资源:用正则匹配后缀,例如
location ~* \.(jpg|jpeg|png|gif|ico|webp)$ - 保护可下载文件(PDF/ZIP):单独配路径,如
location ^~ /download/或location ~* \.pdf$ - 避免和 root、index、rewrite 等指令冲突,确保该 location 内有
root或alias指向真实文件目录
二、设置 Referer 白名单:兼顾合法场景
valid_referers 必须写在对应 location 块内,常见安全又实用的写法:
-
none:允许直接在浏览器地址栏输入 URL 访问(比如用户收藏图片链接) -
blocked:允许被代理、隐私模式或某些防火墙过滤掉 Referer 的请求 -
yourdomain.com:精确匹配主域名 -
*.yourdomain.com:覆盖所有子域名(如 blog.yourdomain.com、cdn.yourdomain.com) - 可叠加多个域名:
valid_referers none blocked yourdomain.com *.yourdomain.com partner-site.com;
三、拦截非法请求:用 if + return 或 rewrite
校验后需显式处理 $invalid_referer 变量,典型做法:
- 返回标准禁止响应:
if ($invalid_referer) { return 403; } - 跳转到自定义提示页(需确保该页面本身不禁链):
if ($invalid_referer) { return 302 /img/forbidden.png; } - 注意:
if在 location 中可用,但不可嵌套;不要在 if 内写 proxy_pass 或 rewrite 到外部地址,易出错
四、验证与避坑提醒
配置完务必执行两步:
- 检查语法:
nginx -t,通过再 reload:nginx -s reload - 用 curl 测试:
curl -e "https://baidu.com" https://yourdomain.com/img/test.jpg应返回 403;curl -e "https://yourdomain.com" ...应正常返回 - 警惕空 Referer 被误杀:如果网站含 iframe、PWA 或某些前端框架,可能默认不带 Referer,务必保留
none - Referer 可伪造,仅防普通盗链;高敏感资源(如付费 PDF)建议叠加 URL 签名或 accesskey 模块


















