GeoIP重定向循环 - 如何解决?

时间:2014-01-21 22:10:07

标签: javascript redirect geoip

我想根据用户的IP地址将用户重定向到不同的语言/子文件夹。为此,我使用MaxMind的JavaScript GeoIP API。

问题:说英语的人应该留在mydomain.com而不是去mydomain.com/en/。但是,当我重定向到mydomain.com时,GeoIP脚本再次运行,从而产生无限循环。

这是我的代码(在mydomain.com的index.html中):

<script language="JavaScript" src="http://j.maxmind.com/app/geoip.js"></script>
<script language="JavaScript">
 var country = geoip_country_code();
 if(country  == "FR")      
  {
  window.location = "http://mydomain.com/fr/"
  }
 else   
  {
  window.location = "http://mydomain.com/";
  }
</script>

在其他帖子中,我读到了关于设置cookie的内容,但我无法以解决问题的方式进行操作(当用户不接受cookie时,它仍会创建循环,例如,在移动设备上。)

另一个解决方案可能是重定向到mydomain.com/en/并通过htaccess删除URL中的/ en /文件夹,但我也无法完成此操作。

我希望它如何工作的一个例子是waze.com(看起来他们在/ en /文件夹中有英文版,但是从URL中删除它。)

所以,如果有人能够提供帮助,我将非常感激。非常感谢!

编辑:我自己解决了这个问题。它非常简单:只需使用英文页面的根目录并将功能更改为&#34;否则{null;}&#34; : - )

1 个答案:

答案 0 :(得分:0)

您的问题不在于geoip,而在于您的代码。

试试这个:

var country = geoip_country_code();
var currentLocation = String(window.location);

//if geoip is equal FR and window.location is different "http://mydomain.com/fr/"
if(country === "FR" && currentLocation.indexOf("http://mydomain.com/fr/")!==0)
{
    window.location = "http://mydomain.com/fr/"
}
//if geoip is different FR and window.location is equal "http://mydomain.com/fr/"
else if(currentLocation.indexOf("http://mydomain.com/fr/")===0)
{
    window.location = "http://mydomain.com/";
}

要使用多种语言进行检测,只需编辑以下变量:

  1. var defaultsLang是主根支持的语言(site.com /)

  2. 子页面支持的
  3. var languages种语言(site.com/fr/,site.com/es/等)

  4. 参见代码(未测试):

    (function(){
        var defaultsLang = ["en-us","en"];
        var languages = {
            "fr": true,     //enable french pages
            "pt": false,    //tmp disable portuguese pages
            "es": true      //enable spanish pages
        };
        var country = geoip_country_code().toLowerCase(),
        currentLocation = String(window.location),
        detectCurrent = function(){
            var a = currentLocation.replace(/^(http|https)[:]\/\//, "");
            var b = a.split("\/");
            b = b[1].toLowerCase();
            a = null;
            return b.length<5 && (/^[a-z\-]+$/).test(b) ? b : false;
        };
    
        var currentLang = detectCurrent();
            defaultsLang = "|"+defaultsLang.join("|")+"|";
    
            if(currentLang!==country && typeof languages[country] !=="undefined" && languages[country]!==false){
                window.location = "http://mydomain.com/" + country + "/";
            } else if(
                defaultsLang.indexOf("|" + currentLang + "|")===-1 && //current page is not the same as default languague(s)
                defaultsLang.indexOf("|" + country + "|")!==-1 && //geoip is in the list of default language(s)
                currentLang!==false
            ){
                window.location = "http://mydomain.com/";
            }
    })();