2009年开始我们就在网址中调用了Google Maps API,后来Google因故退出中国大陆,Google的多项服务都无法使用,我们就让主要针对国外浏览者的站点继续使用Google Maps API,主要针对国内浏览者的站点改用Baidu地图API,不过这样的话,主要针对国外浏览者的站点中的Google Maps API代码就会让少数国内浏览者(包括我们开发者自己)无法看到地图并且严重拖慢网页加载速度。
最近同事看到其它国内网址依然在使用Google地图,我去查了一下,先找出问题原因:是国内的GFW有意让dns把maps.google.com域名解析到错误的ip上去,例如:在国内ping maps.google.com的ip是216.58.196.238,在国外服务器上ping maps.google.com的ip是172.217.25.110,虽然这两个IP都是位于美国Mountain View的Google 公司所属IP地址,但前面一个并不提供Maps API,自然造成地图无法显示。
然后在网上搜索解决办法,并且自己在网站中试验了,主要有两种方式可以采用:
方法一、统一修改网址为IP地址:
修改调用API的URL中的maps.google.com,改为直接写一个可用的IP,例如把调用google maps api程序中的
<script type='text/javascript' src='//maps.google.com/maps/api/js?sensor=false'></script>
改为:
<script type='text/javascript' src='//172.217.25.110/maps/api/js?sensor=false'></script>
然后在国内就可以看到google地图了。
其缺点是IP地址可能变动,而且无法让浏览者自动找到最近的IP地址。
方法二、只针对国内浏览者修改:
首先判断浏览者的IP在国内还是国外,如果是国外就直接调用官方提供的URL的API,如果是国内就改为调用另外的URL的API(可以是上面示范的直接写的IP地址,或者是下面示范的ditu.google.cn):
if (user_country() == 'CN') { $google_map_url = '//ditu.google.cn/maps/api/js?sensor=false&language=zh-CN'; } else { $google_map_url = '//maps.google.com/maps/api/js?sensor=false'; } ... ... <script type='text/javascript' src='$google_map_url'></script>
加了上面一段判断、赋值,这样是最合理的办法。这种办法修改的一个例子请看:IP地址位置地图。
其缺点是首先要增加判断ip所在国家的功能,稍微有点麻烦,那个user_country()函数需要另外写,并且有IP国家归属的库可以调用。
评论2
我看了例子
打开例子 不行啊我试了一下,可以用,只是国内打开很慢很慢,而且地图出得不全
我试了一下,可以用,只是国内打开很慢很慢,而且地图出得不全,还是收到GFW一定干扰吧。