【问题标题】:Redirect Loop during the language detection语言检测期间的重定向循环
【发布时间】:2013-11-11 03:06:30
【问题描述】:

人,

我正在开发一个基于 HTTP_ACCEPT_LANGUAGE 的函数,当我测试时,浏览器会显示一个重定向循环。我调查了其他帖子中提供的所有解决方案,但不起作用

更新:我首先尝试使用 httaccess 检测语言并使用正确的页面和语言变量重定向到正确的页面,但我发现了同样的问题。问题是我使用了两个变量:page(确定用户在哪个页面)和 lang(适当的语言,取决于用户的口语)。但是当用户第一次到达站点时:两个变量都是空的,所以这样做的目的是检测用户的浏览器语言,然后将其重定向到正确的 url,在我的情况下...... index.php?例如 page=index&lang=en...

我这样做了:

**init.php**

$supportedLangs = array (
    'en-GB',
    'en-US',
    'es-ES',
    'es-AR'
 );

 $languages = explode ( ',', $_SERVER ['HTTP_ACCEPT_LANGUAGE'] );

 detectBrowserLanguage($languages,$supportedLangs);



 **functions.php**


 function detectBrowserLanguage($languages,$supportedLangs) {

foreach ( $languages as $lang ) {
    if (in_array ( $lang, $supportedLangs )) {

            // Set the page locale to the first supported language found
         switch ($lang) {
        case 'es-ES' :
        header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
        exit ();
        break;

        case 'en-US' :
        header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
        exit ();
        break;

        case 'en-GB' :
        header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
        exit ();
        break;

        default :
        header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
        exit ();
        break;
        }
    }
    }
   }

【问题讨论】:

  • 在你的代码中没有办法跳出循环。假设如果您检测到语言en 并重定向到index.php?pagina=inicio&lang=en,在重定向页面上它将再次检测语言en 并再次重定向到index.php?pagina=inicio&lang=en(无限循环)
  • 根据浏览器的首选语言包含相关代码而不是使用lang=重定向不是更好的方法。这样您就可以知道用户首次访问该页面时首选的语言。 (无重定向 = 更好、用户友好、更快的网站)

标签: php http redirect infinite-loop


【解决方案1】:

您可能正在从 index.php 页面调用 detectBrowserLanguage。确保在 URL 中传递 Lang 参数时不调用该函数。

你可以检查一下

isset($_GET['lang'])

【讨论】:

    【解决方案2】:

    如果页面已经是检测到的语言,我添加了一种方法来打破循环。注意:请参阅我对您问题的评论。

    $supportedLangs = array (
        'en-GB',
        'en-US',
        'es-ES',
        'es-AR'
     );
    
     $languages = explode ( ',', $_SERVER ['HTTP_ACCEPT_LANGUAGE'] );
     $currentLanguage='';
     if(isset($_GET['lang'])){
          $currentLanguage=$_GET['lang'];
     }
     detectBrowserLanguage($languages,$supportedLangs, currentLanguage);
    

    功能

    function detectBrowserLanguage($languages,$supportedLangs, $currentLanguage) {
    
        foreach ( $languages as $lang ) {
            if ($lang == $currentLanguage){
                return; //If the page is already redirected just return.
            }elseif (in_array ( $lang, $supportedLangs )) {
    
                    // Set the page locale to the first supported language found
                 switch ($lang) {
                case 'es-ES' :
                header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
                exit ();
                break;
    
                case 'en-US' :
                header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
                exit ();
                break;
    
                case 'en-GB' :
                header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
                exit ();
                break;
    
                default :
                header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
                exit ();
                break;
                }
            }
        }
    }
    

    编辑:

    您可以使用http_negotiate_language 轻松完成此操作。这只是有关如何执行此操作的指南。我没有测试过这个(只是在这里输入)

    function detectBrowserLanguage($supportedLangs, $currentLanguage) {
        $negotiated_language = http_negotiate_language($supportedLangs);
        if ($currentLanguage != $negotiated_language){
            switch ($negotiated_language) {
                case 'es-ES' :
                header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
                exit ();
                break;
    
                case 'en-US' :
                header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
                exit ();
                break;
    
                case 'en-GB' :
                header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
                exit ();
                break;
    
                default :
                header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
                exit ();
                break;
            }
        }
    
    }
    

    参考:

    1. W3 Accept-Language RFC
    2. Language Tags

    【讨论】:

    • 我尝试了这个,但没有任何改变。在网站导航期间,我使用页面和 URL 中的语言,所以可能存在问题
    • 您能检查一下$languages$_GET['lang'] 中的内容吗?另请注意HTTP_ACCEPT_LANGUAGE 不需要发送en-EN 格式检查w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
    • 我应该将 pagina 和 lang 值设置为空,如果浏览器检测到这一点,则根据浏览器语言配置为它们分配正确的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多