AI 地图
产品服务
解决方案
文档与支持
定价
更新时间: 2026/07/02 21:01
为什么需要代理

JSAPI 默认通过 URL 参数 ?ak=xxx 加载,AK 直接暴露在前端页面源码中。这意味着:

  1. AK 泄露风险 — 任何人查看页面源码即可获取你的 AK

  2. 配额盗用 — 他人使用你的 AK 调用 API,消耗你的配额

  3. Referer 白名单局限 — 白名单只能防浏览器请求,无法阻止服务端伪造

反向代理将 AK 配置在服务端,前端不再传递 AK,从根本上避免密钥暴露。

代理的原理
  1. 前端请求你自己的服务器(不携带 AK)

  2. 代理服务器将 AK 追加到请求参数中,转发给百度地图 API

  3. 代理服务器通过 BMAP_PROXY_URL 请求头告知百度 API 代理地址,确保返回资源中的相对路径正确拼接

JSAPI 通过 window._BMapSecurityConfig.serviceHost 识别代理地址,将所有后续服务请求(瓦片、检索等)发往该地址。

Nginx 配置示例
server {
listen 80;
server_name your-domain.com;
location ~* ^/_BMapService(.*) {
set $args "$args&ak=你的AK";
proxy_set_header BMAP_PROXY_URL http://your-domain.com/_BMapService;
rewrite ^/_BMapService(.*) $1 break;
proxy_pass https://api.map.baidu.com;
}
}

多个 AK 场景(不同业务使用不同 AK):

server {
listen 80;
server_name your-domain.com;
# 业务 A
location ~* ^/_BMapService(.*) {
set $args "$args&ak=业务A的AK";
proxy_set_header BMAP_PROXY_URL http://your-domain.com/_BMapService;
rewrite ^/_BMapService(.*) $1 break;
proxy_pass https://api.map.baidu.com;
}
# 业务 B
location ~* ^/_BMapService2(.*) {
set $args "$args&ak=业务B的AK";
proxy_set_header BMAP_PROXY_URL http://your-domain.com/_BMapService2;
rewrite ^/_BMapService2(.*) $1 break;
proxy_pass https://api.map.baidu.com;
}
}

关键说明:

  • /_BMapService 是推荐的代理路径前缀,可自定义为任意路径(如 /map-proxy

  • BMAP_PROXY_URL 必须设置,值为代理的完整访问地址

  • 多 AK 时通过不同前缀区分路由

前端使用

两处修改:

<!-- 1.JSAPI 加载之前声明代理配置 -->
<script>
window._BMapSecurityConfig = {
serviceHost: 'http://your-domain.com/_BMapService/'
};
</script>
<!-- 2. 通过代理地址加载 JSAPI,不传 ak 参数 -->
<script src="http://your-domain.com/_BMapService/api?v=4.0"></script>
<script>
var map = new BMap.Map('container');
map.centerAndZoom(new BMap.Point(116.404, 39.915), 12);
</script>

注意事项:

  • _BMapSecurityConfig 必须在 JSAPI script 标签之前定义,否则无效

  • serviceHost 末尾的 / 不可省略

  • 加载 JSAPI 的 URL 也要走代理地址,不再直接请求 api.map.baidu.com

上一篇

JSAPI加载方式

下一篇

基础类
本篇文章对您是否有帮助?