fix(map): SDK 改走同域反向代理,绕开客户端 IPv6 不通
诊断页实测拿到决定性证据:script 的 error 事件在同一秒触发(不是超时),
说明请求立即失败。进一步排查:
- 百度的 DNS 同时返回 A 和 AAAA,浏览器优先连 IPv6
api.map.baidu.com -> A: 36.144.42.203 / 36.144.42.82
AAAA: 2409:8c00:6c21:103c:0:ff:b058:29bf
- 服务器实测:curl -4 得到 HTTP 200 / 0.94s;curl -6 直接失败
=> 该网络环境 IPv6 不通,浏览器扑到 IPv6 死路后立即报错
修复(服务器侧 + 前端):
1. nginx 新增 /bmap-api/ 反向代理(/data/nginx-docker/conf/bmap-proxy.conf,
由 9023 的 server 块 include),proxy_pass 固定 IPv4 36.144.42.203,
Host 头仍为 api.map.baidu.com,客户端只访问本机 9023。
实测经代理加载 SDK:HTTP 200 / 879431 字节 / 0.27s(公网 1.66s)。
2. 前端 loadBaiduMapSdk 改为按顺序尝试:
/bmap-api/getscript(同域代理) -> https://api.map.baidu.com/getscript(直连回退)
3. 诊断页 bmap-test.html 增加「经本站代理加载」区块,
同时验证代理通道和地图瓦片是否可用。
已知限制:SDK 里地图瓦片域名(apimaponline0-3.bdimg.com 等)是硬编码的,
window.B_HOST_TILE_ONLINE_URLS 会被 SDK 自身覆盖,无法通过配置改为代理地址。
若瓦片仍因 IPv6 加载不出,需再做瓦片代理或由客户侧放开 IPv6。