Nginx防盗链需在location块内用valid_referers配合$invalid_referer实现:位置须精准(如按后缀或目录匹配)、白名单含none/blocked/主域/子域/搜索引擎、拦截动作明确(return 403或rewrite提示图并豁免自身),CDN需透传Referer。

直接在 Nginx 配置中用 valid_referers 搭配 $invalid_referer 变量就能实现基础防盗链,关键不是参数堆得多,而是位置写对、白名单写全、响应动作明确。
只在图片和文件路径里生效
防盗链规则必须放在匹配具体资源的 location 块内,不能写在 server 或 http 级别。推荐两种精准写法:
- 按后缀匹配主流格式:
location ~* \.(jpg|jpeg|png|gif|webp|svg|mp4|avi|mov|pdf|zip)$ - 按目录前缀隔离(适合资源集中存放):
location ^~ /static/uploads/或location /assets/images/
注意:如果该 location 中用了 try_files(如 Vue/React 的 history 模式),if ($invalid_referer) 必须写在 try_files 之前,否则请求先 404,根本走不到防盗链逻辑。
白名单要覆盖真实访问场景
valid_referers 是“满足任一即放行”,漏掉常见合法来源会导致自家页面加载失败。必须包含以下几类:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- none:允许 Referer 为空的请求(用户直接输入 URL、书签打开、HTTPS 页面引用 HTTP 资源时浏览器清空 Referer)
-
blocked:允许被代理、防火墙或微信 WebView 修改后的 Referer(如只剩
localhost或路径,不以http://开头) -
主域和子域:显式列出
example.com和www.example.com;或用通配符*.example.com(注意它不包含主域) -
可选加搜索引擎:如
~\.google\. ~\.baidu\. ~\.bing\.,点号需转义,正则以~开头
示例完整写法:valid_referers none blocked example.com *.example.com ~\.google\. ~\.baidu\.;
拦截动作要语义清晰、避免循环
valid_referers 本身不拦截,只设置 $invalid_referer 变量(1=非法)。必须配合 if 执行动作:
- 返回标准拒绝状态:
if ($invalid_referer) { return 403; }(推荐,日志和 CDN 易识别) - 重定向到提示图:
if ($invalid_referer) { rewrite ^/.*$ /images/hotlink-denied.png break; }
若使用提示图,务必单独豁免它自身,否则会无限循环:
location = /images/hotlink-denied.png { }CDN 和 HTTPS 场景要额外注意
如果网站已接入 CDN,单靠源站 Nginx 配置大概率失效,因为 CDN 默认不透传 Referer:
- 在 CDN 控制台开启 “透传 Referer” 或 “保留原始 Referer 头”
- 若 CDN 支持自定义规则,建议也在 CDN 层做一次 Referer 校验,双层防护更可靠
- HTTPS 页面引用 HTTP 图片时,浏览器可能按 Referrer Policy 清空 Referer,此时依赖
none放行

















