图片服务器应配置防盗链降级策略:非法referer请求内部重写为本地“禁止盗链”图,需精确匹配图片后缀、排除占位图自身拦截、白名单含none/blocked、返回强缓存响应并记录referer日志。

对图片服务器设置专门的降级策略,核心是让非法 Referer 请求不返回 403 空白页,而是内部重写为一张本地图片(如“禁止盗链”提示图),既降低用户感知异常,又避免暴露真实资源路径。
明确保护范围与占位图路径
只针对图片后缀做处理,避免影响 JS/CSS 或接口请求。占位图需提前放在 Nginx 可访问的静态目录下(如 /var/www/html/assets/forbidden.png),并确保该路径在 root 指令范围内可读。
- 用 location ~* \.(jpg|jpeg|png|gif|webp|svg)$ 精确匹配图片请求
- 占位图建议使用小尺寸 PNG(如 120×60 像素),带品牌标识和简短提示文字
- 路径不要用绝对 URL(如
https://...),必须是 Nginx 内部可解析的相对路径
配置 valid_referers 白名单并启用降级逻辑
白名单必须包含 none 和 blocked,否则直接访问、微信内嵌页、HTTPS→HTTP 跳转等合法场景也会被误拦。匹配失败时,用 rewrite ... break 实现内部重写,不改变浏览器地址栏。
- 示例配置:
valid_referers none blocked *.example.com example.com ~\.baidu\. ~\.google\.; - 降级动作写在同一个 location 块内:
if ($invalid_referer) { rewrite ^/.*$ /assets/forbidden.png break; } - 注意:rewrite 后的路径要与实际文件位置一致,且不能触发二次防盗链
排除占位图自身被拦截(防死循环)
如果 /assets/forbidden.png 也落入前面的图片 location 规则中,它会被再次校验 Referer,导致 403 或无限重写。必须为这张图单独配置一个不校验 Referer 的 location。
- 添加独立 location 块:
location = /assets/forbidden.png { add_header Cache-Control "public, max-age=31536000"; } - 该块里不写 valid_referers 和 if 判断,也不继承父级防盗链逻辑
- 也可把占位图放到完全独立路径(如 /anti-theft/),再统一 exclude
增强体验与日志追踪
降级图返回时同步优化响应头,并记录盗链行为便于后续分析。
- 给占位图加强缓存:
add_header Cache-Control "public, immutable"; expires 1y; - 在主图片 location 中开启 referer 日志:
log_format referer_log '$http_referer $request'; access_log /var/log/nginx/referer.log referer_log; - 避免对占位图路径重复记录,可在其独立 location 中关闭 access_log











