单纯用 proxy_pass 无法实现防盗链,必须由 Nginx 在 proxy_pass 前通过 valid_referers + $invalid_referer 校验 Referer 并拦截非法请求;进阶可用 secure_link 实现带签名的强防盗链。

单纯用 proxy_pass 无法实现防盗链,它只是反向代理转发;防盗链必须由 Nginx 主动校验请求来源,核心仍是 valid_referers + $invalid_referer 逻辑,且需放在处理静态资源或代理前的 location 块中。
防盗链必须作用在入口 location,不能只靠 proxy_pass
很多人误以为在 proxy_pass 所在的 location 里加防盗链就能保护后端服务——这是错的。因为:
-
proxy_pass是把请求原样(含 Referer)转发给后端,Nginx 自身不拦截、不校验; - 若后端服务本身不校验 Referer,那盗链请求照样能通过;
- 真正有效的防盗链,必须由 Nginx 在请求到达后端前就完成判断并拦截。
正确做法:在 proxy_pass 前加 referer 校验
把防盗链规则写在包含 proxy_pass 的 location 块内,且确保它位于 proxy_pass 之前:
location /api/ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
这样所有发往 /api/ 的请求,先被 Nginx 检查 Referer,不合法直接返回 403,根本不会走到 proxy_pass 这一步。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
注意匹配粒度和路径一致性
防盗链生效依赖 location 的精确匹配范围:
- 如果后端只提供图片资源(如
/static/img/),建议单独配一个 location 匹配该路径,而不是笼统写location /; - 避免把
valid_referers放在location /下却只希望保护图片——可能放过其他敏感接口,也可能误拦合法 AJAX 请求; - 确保前端页面引用资源的路径(如
<img src="https://example.com/static/logo.png">)与 Nginx 中匹配的 location 一致(如location ^~ /static/)。
进阶:结合 secure_link 实现带签名的强防盗链
当需要防 Referer 伪造、有时效控制时,可对后端下发的资源链接做签名,再由 Nginx 校验:
- 后端生成带
md5和expires参数的 URL,例如:/file.pdf?md5=abc123&expires=1743728400; - Nginx 启用
secure_link模块(需编译时加--with-http_secure_link_module); - 配置示例:
location /file/ {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr your_secret_key";
if ($secure_link = "") { return 403; }
if ($secure_link = "0") { return 410; }
proxy_pass http://backend_file_server;
}
这种方式不依赖 Referer,安全性更高,但要求后端配合生成签名 URL,适合下载页、会员资源等场景。

















