防盗链白名单通过location块内的valid_referers指令配合$invalid_referer变量实现,用于拦截非法referer请求并返回403。

防盗链白名单不是配置在 server_name 指令里,而是通过 valid_referers 指令配合 $invalid_referer 变量,在 location 块中实现的。关键在于识别合法来源(即“白名单域名”),再对不匹配的请求返回 403。
防盗链白名单的核心配置位置
必须放在 location 块内(通常针对静态资源路径),不能写在 server_name 行或 http 全局块中。典型适用场景是图片、视频、字体、JS/CSS 等易被外链的静态资源。
-
location 匹配资源类型:例如
location ~* \.(jpg|png|gif|webp|js|css)$ - valid_referers 定义白名单:列出允许访问的来源域名,支持通配符和特殊值
-
用 if + return 403 拦截非法请求:Nginx 会自动把检查结果存入
$invalid_referer变量
白名单域名怎么写(valid_referers 的常用参数)
valid_referers 后面跟的不是正则,而是几类预设含义的值,组合使用即可构建白名单:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- none:允许直接在浏览器地址栏输入 URL 访问(无 Referer)
- blocked:允许 Referer 存在但被代理/防火墙清空的情况(值非 http/https 开头)
-
server_names:允许当前 server 块中定义的
server_name域名(如example.com) -
具体域名或通配符:例如
example.com *.mycdn.com,注意通配符只支持前缀形式(*.abc.com可,abc.*.com不可)
一个完整可用的防盗链示例
假设你的站点域名为 www.example.com,只允许本站、app.example.com 和 CDN 域名 cdn.example.net 引用图片:
server {
listen 80;
server_name www.example.com;
<pre class="brush:php;toolbar:false;">root /var/www/html;
index index.html;
location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {
valid_referers none blocked www.example.com app.example.com *.example.net;
if ($invalid_referer) {
return 403;
}
expires 7d;
add_header Cache-Control "public, immutable";
}}
说明:
– 这段配置放在某个 server 块里,就只对该域名生效;
– 多个域名用空格分隔,*.example.net 能匹配 img.example.net、static.example.net;
– return 403 是推荐做法,语义清晰、日志可查、CDN 友好。
注意事项和常见坑
- Referer 可伪造:该机制防的是普通爬虫和粗放盗链,不能替代鉴权,敏感资源请加 Token 或登录校验
-
HTTPS 页面引用 HTTP 资源会丢失 Referer:现代浏览器默认不发送,导致合法请求也被拦,建议全站 HTTPS 并启用
Referrer-Policy: strict-origin-when-cross-origin -
CDN 或反向代理后,真实客户端 IP 和 Referer 可能被覆盖:需确认上游是否透传
Referer头(如 Nginx 中设置proxy_set_header Referer $http_referer;) - 不要在 if 中用 rewrite 替代 return 403:容易丢参数、状态码变成 200,掩盖拦截行为,不利于排查










