JSAPI 默认通过 URL 参数 ?ak=xxx 加载,AK 直接暴露在前端页面源码中。这意味着:
AK 泄露风险 — 任何人查看页面源码即可获取你的 AK
配额盗用 — 他人使用你的 AK 调用 API,消耗你的配额
Referer 白名单局限 — 白名单只能防浏览器请求,无法阻止服务端伪造
反向代理将 AK 配置在服务端,前端不再传递 AK,从根本上避免密钥暴露。
前端请求你自己的服务器(不携带 AK)
代理服务器将 AK 追加到请求参数中,转发给百度地图 API
代理服务器通过 BMAP_PROXY_URL 请求头告知百度 API 代理地址,确保返回资源中的相对路径正确拼接
JSAPI 通过 window._BMapSecurityConfig.serviceHost 识别代理地址,将所有后续服务请求(瓦片、检索等)发往该地址。
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;# 业务 Alocation ~* ^/_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;}# 业务 Blocation ~* ^/_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
上一篇
下一篇