Nginx中用try_files实现图片防盗链并返回默认图的核心是:先用valid_referers和if校验Referer,不合法时rewrite到/internal路径;再在internal location中用try_files按序查找默认图或占位图。

在 Nginx 中用 try_files 实现图片防盗链并返回默认图,核心思路是:先校验请求来源(Referer),不合法时跳转到一个内部 location;该 location 用 try_files 尝试返回默认图,若默认图也不存在则返回 404 或占位图。
1. 基础防盗链判断(基于 Referer)
Nginx 本身不直接支持“防盗链 + try_files 联动”,需配合 valid_referers 和 if 实现跳转逻辑。注意:if 在 location 中可用,但应避免嵌套复杂条件。
示例配置片段:
location ~* \.(jpg|jpeg|png|gif|webp)$ {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
rewrite ^(.*)$ /default-placeholder.png last;
}
}说明:
-
valid_referers定义合法来源:允许空 referer(none)、禁止无效域名(blocked)、指定域名(如*.example.com) -
$invalid_referer是 Nginx 内置变量,匹配失败时为真 -
rewrite ... last触发内部重定向(不改变 URL,客户端无感知),跳转到/default-placeholder.png
2. 内部 location 处理默认图(用 try_files)
为确保重定向后能用 try_files 查找默认图(包括 fallback 到更通用的占位图),需定义一个内部 location(用 internal 可选,防止外部直接访问):
location = /default-placeholder.png {
internal; # 可选:禁止外部直接请求此路径
root /var/www/static;
try_files $uri /img/placeholder.png =404;
}说明:
-
location = /default-placeholder.png精确匹配重写后的路径 -
root /var/www/static表示默认图实际存放根目录(即请求/default-placeholder.png对应文件为/var/www/static/default-placeholder.png) -
try_files $uri /img/placeholder.png =404:先找原路径,找不到则尝试/var/www/static/img/placeholder.png,最后返回 404
3. 可选增强:统一占位图路径 + MIME 类型支持
若默认图是 WebP 或需要自动适配格式,可结合 map 或 add_header,但最简方案建议:
- 所有默认图统一存为
.png,保证兼容性 - 确保 Nginx 已加载
mime.types,或手动添加:types { image/webp webp; } - 若需返回固定尺寸的 SVG 占位图(如 1×1 像素),可直接用
return避开文件查找:location = /default-placeholder.png { internal; add_header Content-Type image/svg+xml; return 200 '<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>'; }
4. 注意事项与常见问题
关键细节决定是否生效:
-
if指令在 location 中有效,但不能出现在server级别直接调用try_files—— 必须通过 rewrite + location 分离逻辑 - 确保
root或alias设置正确:root拼接完整 URI 路径;alias替换 location 前缀(例如alias /var/www/static/;+location = /default.png→ 文件为/var/www/static/default.png) - 测试时用
curl -H "Referer: https://evil.com"模拟盗链请求,观察响应头和 body - 避免使用
rewrite ... redirect(302),否则会暴露默认图 URL,失去“隐藏”效果











