当前位置

让国内国外都可以调用Google地图API

James Qi 在 2016年11月15日 - 13:46 提交

  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国家归属的库可以调用。

评论

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。