【问题标题】:How can I redirect visitors to another site based in geographical location or IP using PHP or JavaScript?如何使用 PHP 或 JavaScript 将访问者重定向到基于地理位置或 IP 的另一个站点?
【发布时间】:2018-11-05 07:43:54
【问题描述】:

我有一个位于 example.com 域的“index.html”多语言网站。这个 index.html 应该有一些重定向代码,所以当用户访问“example.com”时,他们会被重定向到网站的西班牙语或英语版本。

我希望以最简单的形式阅读条件语句:

如果 IP 位于讲西班牙语的国家/地区,则重定向到 example.com/es,否则如果世界其他任何地方重定向到 example.com/en

如何使用 PHP 或 Javascript 进行设置?

【问题讨论】:

    标签: javascript php


    【解决方案1】:

    您尝试的不是一个好主意,因为您必须检查每个请求的 ip,这可能会导致一些无用的超时,直到用户被重定向到该站点。而且您需要一项服务来检查可能需要花费的 URL。

    通常您使用浏览器语言进行重定向。为此,您的浏览器会发送带有该语言的标题。

    $lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    

    然后您可以检查语言并重定向到您想要的网站。

    switch($lang) {
        case "de-DE":
        case "fr-EN":
            header("Location: http://www.example.com/$lang/index.html");
            break;
        default:
            header("Location: http://www.example.com/en-GB/index.html");
            break;
    }
    

    你可以试试这样的。

    【讨论】:

      【解决方案2】:

      如果你想使用IP地址来确定用户位置,你应该使用GeoIP2MaxMind等特殊数据库。通常它们不是免费的,所以你应该挖掘这个区域来了解你可以做什么在这种情况下使用。

      还有另一种不太准确但简单的方法:HTTP 标头。现代浏览器发送特定的用户区域设置以显示访问者喜欢的语言。

      请记住,浏览器通常会发送接受区域设置(语言)列表:ru-ru,ru;q=0.8,en-us;q=0.6,en;q=0.4。互联网上的大多数答案都忽略了这个问题,并且只使用第一个选项(或者在最坏的情况下甚至只使用前两个字符)。

      例如,您可能会注意到 @Stony 甚至建议您对整个字符串使用 switch 运算符,这在 99% 的情况下不起作用,因为 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 通常包含比 de-DE 或 @987654327 复杂得多的字符串@。

      【讨论】:

        【解决方案3】:

        Stony 对通过 php 执行此操作有很好的响应,如果那是您的后端,我强烈建议您这样做。但是,您也可以通过多种方式在客户端上使用 javascript 执行此操作。

        首先是使用javascript通过浏览器获取用户的坐标。但是,要做到这一点,您的用户必须允许您查看他们的位置。你可以很简单地做到这一点:

        let userLocationData = {};
        if ("geolocation" in navigator) {
          navigator.geolocation.getCurrentPosition(function(position){
            userLocationData.lat = position.coords.latitude;
            userLocationData.long = position.coords.longitude;
          })
        }
        

        当然,这只是纬度/经度。然后,您需要使用一些 api 从中获取更好的数据。我使用地理名称。再说一次,这取决于您是在客户端还是服务器上执行此操作,但我将举一个 Meteor 的 HTTP 服务的示例,尽管您可以使用 ajax 或 express 或任何其他方式来执行此操作。

        let locationResults = HTTP.call('GET',`http://api.geonames.org/findNearbyPostalCodesJSON?formatted=true&lat=${userLocationData.lat}&lng=${userLocationData.long}&username=YOURUSERNAMEHERE`;
        

        这将返回一个对象数组。所以你可以这样做:

        userLocationData.country = locationResults[0].countryCode;
        

        您可以访问此网址以查看该数据的外观。 http://api.geonames.org/findNearbyPostalCodesJSON?formatted=true&lat=40.987148&lng=-90.0803689&username=thatgibbyguy

        现在,您有了他们的位置和国家/地区。但是你能从中分辨出语言吗?我会说不。您可能应该只检查他们的语言:

        userLocationData.language = navigator.language;
        

        这将使用用户自己的语言设置,您可以立即使用。从那里你很容易改变路线:

        window.location.replace(`http://yoursite.com/${userLocationData.language}`/);
        

        【讨论】:

          【解决方案4】:

          我终于对 Stony 的代码进行了一些修改,我的服务器不允许我使用标头,因为它是一个免费的子域托管站点。所以我改为使用 META 进行更改...并且它有效我测试了更改浏览器的语言配置,查看并感谢

              <?php
          
          $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
          
          
          
          switch($lang) {
              case "es":
              echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=http://example_site.com\">";
                  break;
              case "es-ES":
              echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=http://example_site.com\">";
                  break;
              case "es-AR":
              echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=http://example_site.com\">";
                  break;
          
          
              default:
                  include("index.html");
                  break;
          
          }
          
          ?>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-05
            • 1970-01-01
            • 1970-01-01
            • 2014-10-12
            • 1970-01-01
            • 2011-04-30
            相关资源
            最近更新 更多