nginx防盗链返回自定义403图片需三步:1.用valid_referers定义合法来源并设$invalid_referer;2.在图片location中if判断并return 403;3.用error_page 403指向/internal图片location,避免循环拦截。

在 Nginx 中实现防盗链并返回自定义 403 图片,核心是通过 valid_referers 判断来源域名,再用 error_page 指向一张本地图片资源,同时确保该图片不被拦截(即自身不受防盗链规则限制)。
1. 配置 valid_referers 限定合法来源
在 server 或 location 块中添加 referer 白名单检查:
- 使用
valid_referers定义允许访问的来源,例如只允许本站和指定合作站点 - 若请求头中的
Referer不匹配,则内置变量$invalid_referer会为 1 - 常见写法示例:
valid_referers none blocked server_names
*.example.com example.net
~\.google\.
~\.baidu\.;其中 none 允许直接输入 URL 访问(无 referer),blocked 允许被防火墙/代理 stripped 的 referer,server_names 和正则用于灵活匹配。
2. 使用 if 判断并重写或返回错误
在需要防盗链的 location(如图片目录)中,用 if 拦截非法请求:
- 推荐用
return 403触发错误页机制,比rewrite更清晰可靠 - 避免在 if 中使用 proxy_pass 或 root 等复杂指令(Nginx 官方不建议)
- 示例配置:
location ~* \.(jpg|jpeg|png|gif|webp)$ {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
}3. 配置 error_page 指向自定义 403 图片
在 server 块顶层(或 http 块)设置错误页映射,并确保该图片路径可公开访问:
- 用
error_page 403 /403-forbidden.png;将 403 响应重定向到静态图片 - 必须单独配置一个 location 匹配该图片路径,且不启用防盗链(否则会循环 403)
- 示例:
error_page 403 /403-forbidden.png;
<p>location = /403-forbidden.png {
internal; # 只允许内部跳转,防止直接 URL 访问
alias /var/www/static/403-forbidden.png;
}</p>注意:internal 是关键——它让该图片只能通过 error_page、rewrite 等内部跳转访问,不能被浏览器直接请求,既安全又避免防盗链误伤。
4. 验证与调试要点
- 测试时用 curl 模拟不同 referer:
curl -H "Referer: https://evil.com" https://yoursite.com/test.jpg - 检查响应状态码是否为 403,响应体是否为预期图片(可用
file -i验证 content-type) - 确保图片 MIME 类型正确:Nginx 通常能自动识别,但若返回乱码,可显式添加
add_header Content-Type image/png; - 日志中可通过
$invalid_referer变量记录拦截情况,便于审计











