Nginx防盗链需用valid_referers定义合法Referer,配合if判断$invalid_referer重定向至免检错误图;错误图location须绕过防盗链,配置root、expires及正确MIME类型,并建议记录盗链日志。
在 Nginx 中实现防盗链并返回自定义错误图片,核心是通过 valid_referers 指令识别合法来源,再用 if + rewrite 或 return 重定向到一张提示图。关键在于路径配置、MIME 类型支持和缓存控制,避免出现 403 后图片不显示或被再次盗用。
先定义哪些 Referer 是允许访问静态资源(如 jpg/png)的。支持域名通配、正则匹配和空 Referer(直接访问或浏览器拖入地址栏):
对图片后缀做 location 匹配,用 if 判断 referer 不合法时,用 rewrite 302 跳转到一张内置提示图(推荐用 rewrite 而非 return,便于浏览器缓存该图):
注意:$invalid_referer 是 valid_referers 设置后自动生效的内置变量,值为 1 表示非法。
上面跳转的 /img/forbidden.png 必须绕过防盗链规则,否则会循环返回 403 或空白。方法是在其 location 块中显式关闭 referer 检查:
仅返回图片还不够,建议加几项优化:
include mime.types 已加载expires 指令缓存错误图,减少重复请求access_log /var/log/nginx/hotlink.log main;return 403 直接响应——用户看不到图;也慎用 return 302 /xxx,部分 CDN 或客户端可能不跟随重定向