fix(map): 改写百度地图 SDK,SDK/瓦片/接口全部走本站 IPv4 代理
现象(客户实测):SDK 不报错了,但地图区域空白、地址搜索一直转圈。
原因:SDK 加载通了,可它内部请求的瓦片(apimaponline0-3.bdimg.com)
和地理编码接口(api.map.baidu.com)仍然从客户端直连百度,
而这些域名的 DNS 同样优先返回 AAAA(IPv6),该网络 IPv6 不通,全部超时。
解决:把 SDK 里所有百度域名改写成本站代理路径,由服务器用固定 IPv4 回源。
服务器侧(nginx,配置在 /data/nginx-docker/conf/bmap-proxy.conf,
由 9023 server 块 include):
/bmap-api/ -> api.map.baidu.com 36.144.42.203
/bmap-tile0-3/ -> apimaponline0-3.bdimg.com 111.132.36.38(Host 逐个区分)
/bmap-sv0-1/ -> apisv0/1.bdimg.com 111.132.36.38
/bmap-webmap/ -> webmap0.bdimg.com 183.204.201.38
/bmap-map/ -> map.baidu.com 112.34.112.45
/bmap-sdk.js -> 改写版 SDK(随 dist 发布)
前端:public/bmap-sdk.js 为改写产物(把 "//api.map.baidu.com 等替换为
"//" + window.location.host + "/bmap-api 等,瓦片域名数组替换为
(window.location.host + "/bmap-tileN"))。loadBaiduMapSdk 的加载顺序改为:
/bmap-sdk.js(改写版,全走代理)
-> /bmap-api/getscript(官方版经代理,瓦片仍直连,兜底)
-> https://api.map.baidu.com/getscript(仅 IPv6 正常环境可用)
诊断页 bmap-test.html 增加第三块「本站改写版 SDK」,用与正式页面相同的方式
加载并渲染地图,便于客户直接确认瓦片是否正常。
实测:/bmap-sdk.js 公网 HTTP 200 / 879971B / 0.93s;
/bmap-api/getscript 200 / 879431B;各瓦片代理均返回 200 image/png。
(SDK 里仍有 2 处 api.map.baidu.com 属错误上报白名单、8 处 apimaponlineN 属卫星图
瓦片,不影响普通地图,暂不改写。)