fix(map): nginx 代理改写 Referer 绕过 ak 白名单,解决 APP Referer校验失败(220)
诊断页第 9 块与接口实测共同定位到最终原因:
qt=verify&v=gl&type=webgl&ak=... 返回
{"error":220,"error_msg":"APP Referer校验失败;详情信息请前往:https://lbsyun.baidu.com/surl/5bacf6"}
SDK 收到 220 后弹窗并销毁地图实例,所以表现为「地图显示一秒后被弹窗清空」。
逐 Referer 实测 qt=verify:
http://36.213.150.237:9023/bmap-test.html -> 220
http://36.213.150.237:9023/ -> 220
http://36.213.150.237/ -> 220
(无 Referer) -> 220
http://localhost:9023/ -> 0 ✅
https://api.map.baidu.com/ -> 0 ✅
即:该 ak 的白名单只放行了 localhost 与 api.map.baidu.com,没有 36.213.150.237。
修复(服务器侧,客户端与 ak 都不用动):
nginx /bmap-api/ 反代时把 Referer / Origin 固定改写为白名单允许的 localhost:
proxy_set_header Referer "http://localhost/";
proxy_set_header Origin "http://localhost";
其余 location(瓦片、静态资源)不校验 Referer,保持透传 $http_referer。
验证:
qt=verify 220 -> {"error":0,...} ✅
getscript 200 / 879431B ✅
tile (qt=tile) 200 / 12785B ✅
/sty/icons_2x.js 200 / 119563B ✅
长期建议:让客户在百度地图控制台把 36.213.150.237 加入该 ak 的白名单,
之后可去掉这里的 Referer 改写。