2010-09-14 3 views
1

У меня есть следующий код в качестве моего index.php для моего многоязычного веб-сайта. Каждый доступный язык имеет подкаталог.Googlebot получает ошибку

<?php 


if (isset($_POST['URL']) && strlen($_POST['URL']) == 3) { 
     header("location: ".$_POST[URL]); 
} 
else { 

    function lixlpixel_get_env_var($Var) 
    { 
     if(empty($GLOBALS[$Var])) 
     { 
      $GLOBALS[$Var]=(!empty($GLOBALS['_SERVER'][$Var]))? 
      $GLOBALS['_SERVER'][$Var] : (!empty($GLOBALS['HTTP_SERVER_VARS'][$Var])) ? $GLOBALS['HTTP_SERVER_VARS'][$Var]:''; 
     } 
    } 

    function lixlpixel_detect_lang() 
    { 
     // Detect HTTP_ACCEPT_LANGUAGE & HTTP_USER_AGENT. 
     lixlpixel_get_env_var('HTTP_ACCEPT_LANGUAGE'); 
     lixlpixel_get_env_var('HTTP_USER_AGENT'); 

     $_AL=strtolower($GLOBALS['HTTP_ACCEPT_LANGUAGE']); 
     $_UA=strtolower($GLOBALS['HTTP_USER_AGENT']); 

     // Try to detect Primary language if several languages are accepted. 
     foreach($GLOBALS['_LANG'] as $K) 
     { 
      if(strpos($_AL, $K)===0) 
      return $K; 
     } 

     // Try to detect any language if not yet detected. 
     foreach($GLOBALS['_LANG'] as $K) 
     { 
      if(strpos($_AL, $K)!==false) 
      return $K; 
     } 
     foreach($GLOBALS['_LANG'] as $K) 
     { 
      if(preg_match("/[[(]{$K}[;,_-)]/",$_UA)) 
      return $K; 
     } 

     // Return default language if language is not yet detected. 
     return $GLOBALS['_DLANG']; 
    } 

    // Define default language. 
    $GLOBALS['_DLANG']='en'; 

    // Define all available languages. 
    // WARNING: uncomment all available languages 

    $GLOBALS['_LANG'] = array(
    'en', // english. 
    'es', // spanish. 
    'fr', // french. 
    ); 

    /* 
    $GLOBALS['_LANG'] = array(
    'af', // afrikaans. 
    'ar', // arabic. 
    'bg', // bulgarian. 
    'ca', // catalan. 
    'cs', // czech. 
    'da', // danish. 
    'de', // german. 
    'el', // greek. 
    'en', // english. 
    'es', // spanish. 
    'et', // estonian. 
    'fi', // finnish. 
    'fr', // french. 
    'gl', // galician. 
    'he', // hebrew. 
    'hi', // hindi. 
    'hr', // croatian. 
    'hu', // hungarian. 
    'id', // indonesian. 
    'it', // italian. 
    'ja', // japanese. 
    'ko', // korean. 
    'ka', // georgian. 
    'lt', // lithuanian. 
    'lv', // latvian. 
    'ms', // malay. 
    'nl', // dutch. 
    'no', // norwegian. 
    'pl', // polish. 
    'pt', // portuguese. 
    'ro', // romanian. 
    'ru', // russian. 
    'sk', // slovak. 
    'sl', // slovenian. 
    'sq', // albanian. 
    'sr', // serbian. 
    'sv', // swedish. 
    'th', // thai. 
    'tr', // turkish. 
    'uk', // ukrainian. 
    'zh' // chinese. 
    ); 
    */ 

    // Redirect to the correct location. 


    header('location: /'.lixlpixel_detect_lang()); 
    //header('location: http://www.your_site.com/index_'.lixlpixel_detect_lang().'.php'); // Example Implementation 
    echo 'The Language detected is: '.lixlpixel_detect_lang(); // For Demonstration 

} 

>

Проблема заключается в том, что, хотя в пользовательских браузерах это прекрасно работает с поисковыми системами (например, Googlebot) следующее сообщение об ошибке брошено:

<br /> 
<b>Warning</b>: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Compilation failed: range out of order in character class at offset 12 in <b>/index.php</b> on line <b>41</b><br /> 
<br /> 
<b>Warning</b>: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Compilation failed: range out of order in character class at offset 12 in <b>/index.php</b> on line <b>41</b><br /> 
<br /> 
<b>Warning</b>: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Compilation failed: range out of order in character class at offset 12 in <b>/index.php</b> on line <b>41</b><br /> 
<br /> 
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at /index.php:41) in <b>/index.php</b> on line <b>110</b><br /> 
<br /> 
<b>Warning</b>: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Compilation failed: range out of order in character class at offset 12 in <b>/index.php</b> on line <b>41</b><br /> 
<br /> 
<b>Warning</b>: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Compilation failed: range out of order in character class at offset 12 in <b>/index.php</b> on line <b>41</b><br /> 
<br /> 
<b>Warning</b>: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Compilation failed: range out of order in character class at offset 12 in <b>/index.php</b> on line <b>41</b><br /> 
The Language detected is: en 

Я попытался обработки ошибок но я не программист на PHP, я программист CF, поэтому мне действительно нужна помощь!

+1

Использовать правильные декларации строк, когда вы имеете в виду строки: Изначально 'URL' в' $ _POST [URL] 'интерпретируется как константа. Только если такой константы не существует, PHP принимает значение строки ''URL' '. – Gumbo

ответ

2

Внутри character class, - обозначает диапазон. В этом случае _-) в [;,_-)] интерпретируется как диапазон (каждый символ между _ и ) включительно). Но _ (0x95) после ) (0x28), поэтому _-) - недопустимый диапазон.

Если вы имеете в виду три отдельных символов _, - и ), избежать -:

[;,_\-)] 

Кроме того, Accept-Language списка взвешенных значений (см Q параметра). Это означает, что только появление определенного языкового тега не обязательно означает, что это наиболее предпочтительный язык. Могут быть языки, которые более предпочтительны (выше q) или даже вообще не принимаются (т. Е. q=0).

Поэтому вместо того, чтобы просто искать появление определенного языкового тега, лучше проанализировать список и найти наилучшее соответствие предпочитаемых языков и доступных языков.

+0

Многие, многие, многие, большое спасибо за это. Вы решили ошибку, и код все еще работает! HERO !!!!!! – harryfear

Смежные вопросы