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一定幹擾吧。