Язык перенаправить или нет - PullRequest
2 голосов
/ 08 июля 2010

У меня есть веб-сайт на нескольких языках. Теперь это настроено так, что он смотрит на язык принятия http и перенаправляет пользователя на конкретный язык или использует язык по умолчанию, когда ничего не найдено.

Проблема, с которой я сталкиваюсь, заключается в том, что веб-сканеры не могут проиндексировать корневую страницу, поскольку она дает перенаправление 302. http://www.mydomain.com перенаправляется на http://www.mydomain.com/nl/

Единственный способ индексации сайта - это если я предоставлю карту сайта для всего сайта, включая языки. Я сделал это, но уже несколько недель не вижу проиндексированных страниц.

Итак, мой вопрос: будет ли лучше, если веб-сайт будет работать на языке по умолчанию.

Чтобы иметь сайт на своем родном языке, вы должны выбрать язык, когда вы находитесь на самом корневом сайте.

1 Ответ

3 голосов
/ 08 июля 2010

Проблема, с которой я сталкиваюсь, заключается в том, что веб-сканеры не могут проиндексировать корневую страницу

Я раньше не сталкивался с этой проблемой.Webcrawlers, безусловно, следует 302 перенаправления.Есть ли вероятность того, что вы (неосознанно) блокируете посетителей без заголовка Accept-Language, как, например, веб-сканеры?

Итак, мой вопрос: будет ли лучше, если веб-сайт будет работать на языке по умолчанию.Чтобы иметь веб-сайт на своем родном языке, вы должны выбрать язык, когда вы находитесь на самом корневом веб-сайте.

Я бы предпочел заголовок Accept-Language и отобразил бы язык, который имеет ближайшийсовпадать с указанным в заголовке языком (ами) согласно HTTP 1.1 Спецификация .Если ничего не указано, я бы отобразил английский как язык по умолчанию или, по крайней мере, язык, который имеет наибольшее покрытие среди (ожидаемой) аудитории веб-сайта.


В истории ваших вопросов я вижу, что выPHP-разработчик, так что вот полезный фрагмент для определения наиболее близкого соответствия на основе заголовка Accept-Language согласно спецификации HTTP 1.1:

function get_language($available_languages, $preferred_language = 'auto') {
    preg_match_all('/([[:alpha:]]{1,8})(-([[:alpha:]|-]{1,8}))?(\s*;\s*q\s*=\s*(1\.0{0,3}|0\.\d{0,3}))?\s*(,|$)/i', 
        $preferred_language == 'auto' ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : $preferred_language, $languages, PREG_SET_ORDER);

    $preferred_language = $available_languages[0]; // Set default for the case no match is found.
    $best_qvalue = 0;

    foreach ($languages as $language_items) {
        $language_prefix = strtolower($language_items[1]);
        $language = $language_prefix . (!empty($language_items[3]) ? '-' . strtolower($language_items[3]) : '');
        $qvalue = !empty($language_items[5]) ? floatval($language_items[5]) : 1.0;

        if (in_array($language, $available_languages) && ($qvalue > $best_qvalue)) {
            $preferred_language = $language;
            $best_qvalue = $qvalue;
        } else if (in_array($language_prefix, $available_languages) && (($qvalue*0.9) > $best_qvalue)) {
            $preferred_language = $language_prefix;
            $best_qvalue = $qvalue * 0.9;
        }
    }

    return $preferred_language;
}

(приведенное выше на самом деле является перезаписью / finetune дляпример, найденный где-то на php.net)

Его можно использовать следующим образом:

$available_languages = array(
    'en' => 'English',
    'de' => 'Deutsch',
    'nl' => 'Nederlands'
);

$requested_language = get_it_somehow_from_URL() ?: 'auto';
$current_language = get_language(array_keys($languages), $requested_language);

if ($requested_language != $current_language) {
    // Unknown language.
    header('Location: /' . $current_language . '/' . $requested_page);
    exit;
}
...