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

Posted

技术标签:

【中文标题】GeoIP 重定向循环 - 如何解决?【英文标题】:GeoIP Redirect Loop - How to solve it? 【发布时间】:2014-01-21 22:10:06 【问题描述】:

我想根据用户的 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 中删除它)。

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

编辑:我自己解决了这个问题。很简单:只需使用英文页面的根目录并将函数更改为“else null;” :-)

【问题讨论】:

你可以在 url 中添加一个 queryString,以便它们重定向到 "/?lang=en" 吗?然后,您可以在 JS 中嗅探 GET 并避免在设置时重定向。 我不确定为什么会发生这种情况,您可以做的一件事是将英语访问者发送到 mydomain.com/en/,然后从那里设置一个 301 到根域。如果您有兴趣,请在此处了解如何使用 301:css-tricks.com/snippets/htaccess/301-redirects 感谢您的建议,但我不想要这样一个“丑陋”的网址。 mydomain.com 应该是英文网站的标准 URL,但是当他们进入 mydomain.com 时,我需要将其他国家的用户重定向到给定的子文件夹。 谢谢,杰克!发生这种情况是因为在我重定向到 mydomain.com 后一次又一次地使用该脚本。重定向到 mydomain.com/en/ 确实有效,但我不希望 URL 中有那个子文件夹,并且通过 htaccess 重定向到 mydomain.com 会再次导致循环 - 我已经尝试过了。 我自己解决了这个问题(见有问题的编辑)。 【参考方案1】:

您的问题不在于 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/";


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

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

    var languages 子页面支持的语言(site.com/fr/、site.com/es/ 等)

查看代码(未测试):

(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/";
        
)();

【讨论】:

感谢您的建议。这段代码对我来说似乎有点太复杂了——尤其是当我想包含更多国家时。也许你能告诉我为什么它比我的简单代码更好? 所以,对于很多国家来说并不复杂。我会试着举个例子,请稍等(我在我的智能手机上)。 @Student 虽然你没有把它放在你的问题中(我认为这是必要的)我编辑了我的答案。现在支持多种语言​​​。祝你好运! 感谢代码!但是由于我的代码完全符合我的要求,我想知道为什么你的更复杂的代码更好? (我是 JS 初学者) @Student 这个问题有点相对。在许多情况下,简单的代码总是更好。在我看来,我的第一个代码更简单、更准确。第二个代码只有在使用多种语言时才有用。

以上是关于GeoIP 重定向循环 - 如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

PHP GEO 位置重定向 - 有没有更好的解决方案? [复制]

“此网页有一个重定向循环”(使用 GeoIP 重定向网站)

重定向到子域会导致重定向循环错误

我如何从我创建的列表中匹配一个国家,然后如果它在列表中则采取行动? (GeoIP 重定向)

PHP GeoIP 循环错误

如何创建重定向页面到新页面