可通过nginx的proxy_set_header指令修改referer请求头以绕过基于该字段的防盗链校验,需先验证目标服务是否依赖referer,再在proxy_pass前设置合法referer值,并通过日志或上游服务端确认生效。

可以通过 Nginx 的 proxy_set_header 指令修改转发给上游服务器的请求头,将 Referer 替换为合法来源(如白名单域名),从而绕过下游服务基于 Referer 的防盗链校验。
确认下游防盗链机制依赖 Referer
并非所有防盗链都只看 Referer,需先验证目标服务是否真正在意该字段:
- 用 curl 或浏览器开发者工具发起请求,分别测试带/不带 Referer、Referer 为空或为非法域名时的响应状态(如 403、302 或图片返回失败)
- 检查响应头中是否有
X-Protected-By: Referer或类似提示,或查看其文档说明 - 注意部分服务还会校验
User-Agent、Origin或签名参数,仅改 Referer 不一定生效
在 proxy_pass 前设置合法 Referer
在 Nginx 配置的 location 块中,使用 proxy_set_header Referer 覆盖原始值:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
location /images/ {
proxy_pass https://origin.example.com/;
proxy_set_header Host origin.example.com;
proxy_set_header Referer "https://trusted-site.com/";
proxy_set_header User-Agent $http_user_agent;
}
- 推荐使用完整 URL(含协议和结尾斜杠),避免被上游当作无效 Referer 拒绝
- 若需动态构造,可用变量如
$scheme://$host,但要确保该域名已在对方白名单中 - 务必在
proxy_pass之前设置,否则会被后续指令覆盖
处理原始 Referer 的常见策略
根据业务需要决定是否保留、清空或替换原始 Referer:
- 强制固定值:
proxy_set_header Referer "https://allowed-domain.com/"; - 清空 Referer(某些场景适用):
proxy_set_header Referer "";(注意双引号不能省略) - 有条件重写:配合
map指令,按原始 Referer 或路径匹配不同白名单 - 避免直接透传:
proxy_set_header Referer $http_referer;可能触发防盗链,慎用
验证与调试要点
配置后必须实际验证是否生效:
- 启用 Nginx 的
error_log并设为info级别,或用log_format记录$upstream_http_referer查看发给上游的值 - 在上游服务端打印收到的 Referer(如 Node.js 的
req.headers.referer),确认是否被正确改写 - 注意浏览器缓存可能干扰测试,建议用 curl 或无痕模式,并添加随机查询参数(如
?t=123)绕过










