需求:客户的电脑都只能访问内,服务器可以访问外网,客户电脑使用的项目中用到了高德webapi2.0。
10.200.31.45:32100是我们的web服务器。

网上基本上都是对高德webapi1.4的配置方式,而web2.0有一些差别。

1.前端修改高德地图的js应用

如果是index.html引入,

修改之前的应用:

        

修改之后的配置:

    <script type="text/javascript" crossorigin    src="maps?v=2.0&key=高德key&plugin=AMap.ToolBar, AMap.ControlBar,AMap.MoveAnimation,AMap.RangingTool,AMap.Geocoder"></script><script src="loca?v=2.0.0&key=高德key"></script>

如果是js动态加载,代码如下:

/** * 创建高德秘钥 * @param secret  */export function createSecret(secret?:string){         secret=secret||'高德秘钥';         // 拼装脚本字符串         const script = document.createElement('script');          // 高德 Web API 初始化配置         script.innerHTML = `           window._AMapSecurityConfig = {            securityJsCode: '${secret}',          };`;         // 将脚本插入到页面头部         document.head.appendChild(script);}//获取地图地址const getMapUrl=()=>{  const {map_offline}=Local.getAmapConfig();  let mapUrl='https://webapi.amap.com';   if(map_offline){    mapUrl='';   }  if (process.env.NODE_ENV === "development"){    mapUrl='https://webapi.amap.com';  }  return mapUrl;}/** * 创建高德script引入脚本 * @param key  * @param url  */export function loadAMapScript(url:string,key?:string) {  key=key||'高德key';  const mapUrl=getMapUrl();  const src =`${mapUrl}/maps?v=2.0&key=${key}${url}`;  console.log('我的src',src);  return new Promise((resolve, reject) => {    const script = document.createElement('script');    script.src = src;    script.async = true;    script.onerror = reject;    script.onload = resolve;    document.head.appendChild(script);  });}/** * 创建高德local script引入脚本 * @param key  * @param url  */ export function loadAMapLocaScript(key?:string,url?:string=''){  key=key||'高德key';  const mapUrl=getMapUrl();  const src =`${mapUrl}/loca?v=2.0&key=${key}${url}`;  return new Promise((resolve, reject) => {    const script = document.createElement('script');    script.src = src;    script.async = true;    script.onerror = reject;    script.onload = resolve;    document.head.appendChild(script);  });}

然后在main.ts中:

import {DefaultAmapConfig} from "@/xd-common-web/xdConst";import {loadAMapLocaScript,loadAMapScript,createSecret} from "@/xd-common-web/utils/map/amapLink";try{console.log('开始加载地图');const mapConfig=Local.getAmapConfig()||DefaultAmapConfig;createSecret(mapConfig.map_secret);await loadAMapScript("&&plugin=AMap.LineSearch,AMap.StationSearch,AMap.PolylineEditor,AMap.Geocoder,AMap.PlaceSearch,AMap.AutoComplete,Amap.ElasticMarker,AMap.PolygonEditor",mapConfig.map_key);await loadAMapLocaScript(mapConfig.map_key);  console.log('地图加载成功');} catch{  console.log('地图加载异常');}

2.nginx配置如下:

       location /restapi/ {          proxy_pass https://restapi.amap.com/;        }       location /restapi/v3/ {          proxy_pass https://restapi.amap.com/v3/;        }        location /webapi/ {                proxy_pass https://webapi.amap.com/;        }        location /webapi/count{           proxy_pass https://webapi.amap.com/count;        }        location /vdata/ {                proxy_pass https://vdata.amap.com/;        }       location /vdata/style_icon/ {            proxy_pass   http://vdata.amap.com/style_icon/;        }       location /vdata/style/{           proxy_pass https://vdata.amap.com/style/;        }        location /vdata01/ {             proxy_pass   https://vdata01.amap.com/;        }        location /vdata02/ {             proxy_pass   https://vdata02.amap.com/;        }         location /vdata03/ {             proxy_pass   https://vdata03.amap.com/;        }        location /vdata04/ {             proxy_pass   https://vdata04.amap.com/;        }         location /wprd01/ {            proxy_pass   https://wprd01.is.autonavi.com/;        }        location /wprd02/ {            proxy_pass   https://wprd02.is.autonavi.com/;        }        location /wprd03/ {            proxy_pass   https://wprd03.is.autonavi.com/;        }        location /wprd04/ {            proxy_pass   https://wprd04.is.autonavi.com/;        }       location /webrd01/ {          proxy_pass   https://webrd01.is.autonavi.com/;        }        location /webrd02/ {            proxy_pass   https://webrd02.is.autonavi.com/;        }        location /webrd03/ {            proxy_pass   https://webrd03.is.autonavi.com/;        }        location /webrd04/ {            proxy_pass   https://webrd04.is.autonavi.com/;        }        #代理获取js api文件并修改文件内容        location /maps {            proxy_set_header Accept-Encoding "";            proxy_pass https://webapi.amap.com/maps;            sub_filter_types *;            sub_filter_once off;            sub_filter 'http://webapi.amap.com' 'http://10.200.31.45:32100/webapi';            sub_filter 'https://webapi.amap.com' 'http://10.200.31.45:32100/webapi';            sub_filter 'http://restapi.amap.com' 'http://10.200.31.45:32100/restapi';            sub_filter 'https://restapi.amap.com' 'http://10.200.31.45:32100/restapi';            sub_filter 'http://vdata.amap.com' 'http://10.200.31.45:32100/vdata';            sub_filter 'https://vdata.amap.com' 'http://10.200.31.45:32100/vdata';            sub_filter 'webapi.amap.com' '10.200.31.45:32100/webapi';            sub_filter 'vdata.amap.com' '10.200.31.45:32100/vdata';            sub_filter 'restapi.amap.com' '10.200.31.45:32100/restapi';            sub_filter 'vdata0{1,2,3,4}.amap.com' '10.200.31.45:32100/vdata0{1,2,3,4}';            sub_filter '{vdata,vdata01,vdata02,vdata03,vdata04}.amap.com' '10.200.31.45:32100/{vdata,vdata01,vdata02,vdata03,vdata04}';            sub_filter 'webapi.amap.com/count' '10.200.31.45:32100/webapi/count';            sub_filter 'webapi.amap.com/theme' '10.200.31.45:32100/webapi/theme';            sub_filter 'restapi.amap.com/v3' '10.200.31.45:32100/restapi/v3';            sub_filter 'webapi.amap.com/style' '10.200.31.45:32100/webapi/style';           sub_filter 'wprd0{1,2,3,4}.is.autonavi.com' '10.200.31.45:32100/wprd0{1,2,3,4}';           sub_filter 'webrd0{1,2,3,4}.is.autonavi.com' '10.200.31.45:32100/wprd0{1,2,3,4}';           sub_filter 'https' 'http';        }        location /loca {            proxy_set_header Accept-Encoding "";            proxy_pass   https://webapi.amap.com/loca;            sub_filter_types *;            sub_filter_once off;            sub_filter 'webapi.amap.com/count' '10.200.31.45:32100/webapi/count';               sub_filter 'https' 'http';        }

至此,就配置好了。注意:实际项目中nginx配置文件中的10.200.31.45:32100可使用变量代替。完整版配置如下:

location /restapi/ {
proxy_pass https://restapi.amap.com/;
}
location /webapi/ {
proxy_pass https://webapi.amap.com/;
}
location /vdata/ {
proxy_pass https://vdata.amap.com/;
}
location ^~/webapi/theme{
proxy_pass https://webapi.amap.com/theme;
}
location /vdata/ {
proxy_pass https://vdata.amap.com/;
}
location ^~/vdata/style_icon/ {
proxy_pass http://vdata.amap.com/style_icon/;
}
location /vdata01/ {
proxy_pass https://vdata01.amap.com/;
}
location /vdata02/ {
proxy_pass https://vdata02.amap.com/;
}
location /vdata03/ {
proxy_pass https://vdata03.amap.com/;
}
location /vdata04/ {
proxy_pass https://vdata04.amap.com/;
}
location /wprd01/ {
proxy_pass https://wprd01.is.autonavi.com/;
}
location /wprd02/ {
proxy_pass https://wprd02.is.autonavi.com/;
}
location /wprd03/ {
proxy_pass https://wprd03.is.autonavi.com/;
}
location /wprd04/ {
proxy_pass https://wprd04.is.autonavi.com/;
}
location /webrd01/ {
proxy_pass https://webrd01.is.autonavi.com/;
}
location /webrd02/ {
proxy_pass https://webrd02.is.autonavi.com/;
}
location /webrd03/ {
proxy_pass https://webrd03.is.autonavi.com/;
}
location /webrd04/ {
proxy_pass https://webrd04.is.autonavi.com/;
}

#代理获取js api文件并修改文件内容
location /maps {
set $proxyip “10.200.31.45:32100”;
proxy_set_header Accept-Encoding “”;
proxy_pass https://webapi.amap.com/maps;
sub_filter_types *;
sub_filter_once off;

sub_filter ‘webapi.amap.com’ ‘$proxyip/webapi’;
sub_filter ‘vdata.amap.com’ ‘$proxyip/vdata’;
sub_filter ‘restapi.amap.com’ ‘$proxyip/restapi’;
sub_filter ‘vdata0{1,2,3,4}.amap.com’ ‘$proxyip/vdata0{1,2,3,4}’;
sub_filter ‘{vdata,vdata01,vdata02,vdata03,vdata04}.amap.com’ ‘$proxyip/{vdata,vdata01,vdata02,vdata03,vdata04}’;
sub_filter ‘wprd0{1,2,3,4}.is.autonavi.com’ ‘$proxyip/wprd0{1,2,3,4}’;
sub_filter ‘webrd0{1,2,3,4}.is.autonavi.com’ ‘$proxyip/wprd0{1,2,3,4}’;

sub_filter ‘https’ ‘http’;
}
location /loca {
set $proxyip “10.200.31.45:32100”;
proxy_set_header Accept-Encoding “”;
proxy_pass https://webapi.amap.com/loca;
sub_filter_types *;
sub_filter_once off;
sub_filter ‘webapi.amap.com/count’ ‘$proxyip/webapi/count’;
sub_filter ‘https’ ‘http’;
}

实现思路:通过特定的前缀maps和loca把高德webapi的引用进行转发,转发之后,高德加载地图时,自动会调用一些接口,使用sub_filter 对返回的内容进行替换,替换为服务器的地址+特定前缀,再根据前缀二次转发即可。

博客地址:http://www.cnblogs.com/jiekzou/
博客版权:本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。
其它:.net-QQ群4:612347965java-QQ群:805741535H5-QQ群:773766020
我的拙作《Vue3.x+TypeScript实践指南》《ASP.NET MVC企业级实战》《H5+移动应用实战开发》《Vue.js 2.x实践指南》《JavaScript实用教程 》《Node+MongoDB+React 项目实战开发》已经出版,希望大家多多支持!