Код статуса HTTP для языкового перенаправления - PullRequest
17 голосов
/ 30 ноября 2011

Интересно, какой код статуса HTTP мне нужно отправить на языковых перенаправлениях.

У меня есть следующий php-код для перенаправления через заголовки HTTP на самый важный язык в заголовке браузера Accept-Language.

<?
$langs = array();

if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    // break up string into pieces (languages and q factors)
    preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);

    if (count($lang_parse[1])) {
        // create a list like "en" => 0.8
        $langs = array_combine($lang_parse[1], $lang_parse[4]);

        // set default to 1 for any without q factor
        foreach ($langs as $lang => $val) {
            if ($val === '') $langs[$lang] = 1;
        }

        // sort list based on value 
        arsort($langs, SORT_NUMERIC);
    }
}

// look through sorted list and use first one that matches our languages
foreach ($langs as $lang => $val) {
    if (strpos($lang, 'ca')===0) {
    header("location: ca/");
    exit;
    } else if (strpos($lang, 'es')===0) {
    header("location: es/");
    exit;
    } 
  echo "$lang => $val<br>";
}
// show default site or prompt for language
header("location: en/");

?>

Смежный вопрос: HTTP-статус для функционального перенаправления

Может быть, 300, 301, 302, 303? Почему?

EDIT

Google недавно опубликовал это: http://googlewebmastercentral.blogspot.com/2011/12/new-markup-for-multilingual-content.html

Я нашел это:

HTTP STATUS 300 Несколько вариантов выбора

Запрашиваемый ресурс соответствует любому из набора представления, каждое со своим конкретным местоположением, и агент- управляемая информация о переговорах (раздел 12) предоставляется таким образом, чтобы пользователь (или пользовательский агент) может выбрать предпочтительное представление и перенаправить его запрос в это место.

Если это не запрос HEAD, ответ ДОЛЖЕН включать объект содержащий список характеристик ресурса и местоположения который пользователь или пользовательский агент может выбрать наиболее подходящий. Формат объекта определяется типом носителя, указанным в Введите поле заголовка. В зависимости от формата и возможностей

пользовательский агент, выбор наиболее подходящего варианта МОЖЕТ быть выполняется автоматически. Однако эта спецификация не определяет любой стандарт для такого автоматического выбора.

Если сервер имеет предпочтительный выбор представления, он ДОЛЖЕН включить конкретный URI для этого представления в Location поле; Пользовательские агенты МОГУТ использовать значение поля Location для автоматического Перенаправление. Этот ответ кэшируется, если не указано иное.

И это:

Ошибка HTTP 300 - множественный выбор

Введение

Ваш веб-сервер считает, что URL-адрес, предоставленный клиентом (например, ваш Веб-браузер или наш робот CheckUpDown) недостаточно конкретен, и дальнейший выбор должен быть сделан из нескольких вариантов.

Обычно это тот случай, когда URL представляет высокий уровень группирование того, какой выбор нижнего уровня должен быть сделан, например, каталог, в котором пользователь должен выбрать определенный файл для доступ.

300 ошибок в цикле HTTP

Уходит любой клиент (например, ваш веб-браузер или наш робот CheckUpDown) через следующий цикл, когда он связывается с веб-сервером:

Получить IP-адрес из IP-адреса сайта (URL сайта без ведущего 'http://'). This lookup (преобразование IP-имени в IP-адрес) предоставляется серверами доменных имен (DNS). Откройте IP сокет подключения к этому IP-адресу. Напишите поток данных HTTP через эту розетку. Получить поток данных HTTP обратно из Интернета сервер в ответ. Этот поток данных содержит коды состояния, чьи значения определяются протоколом HTTP. Разобрать этот поток данных для коды состояния и другая полезная информация. Эта ошибка возникает в последний шаг выше, когда клиент получает код состояния HTTP, который он распознается как «300».

Исправление 300 ошибок - общее

Первое, что вы должны сделать, это проверить ваш URL в веб-браузере. Если вы видите какую-то веб-страницу, предлагающую вам дальнейшие действия действие / выбор, то ваш URL в том виде, как он есть, недостаточно подробен для веб-сервер для обработки.

Исправление 300 ошибок - CheckUpDown

Вы никогда не должны видеть эту ошибку в своей учетной записи CheckUpDown, если вы дал нам URL верхнего уровня (например, www.isp.com) для проверки. Если это так происходят для URL верхнего уровня, весьма вероятно, что веб-сервер программное обеспечение было неправильно запрограммировано или настроено. Если у вас есть предоставил нам низкоуровневый URL (например, www.isp.com/products/index.html) для проверьте, то вполне вероятно, что этот URL не доступен даже через Веб-браузер.

Первое, что вы должны сделать, это проверить ваш URL в веб-браузере.Если вы видите разумную веб-страницу, это может указывать на дефект в нашем программном обеспечении.Однако, если вы видите какую-то веб-страницу, предлагающую вам дальнейшие действия / выбор, тогда ваш URL не подходит для проверки, поскольку наша система не может сделать такой выбор.

Пожалуйста, свяжитесь с нами напрямую.(желательно по электронной почте) всякий раз, когда вы сталкиваетесь с 300 ошибками.Только мы можем решить их для вас.Если в нашем программном обеспечении есть дефект, мы исправим его.Тем не менее, если ваш URL-адрес для нас принципиально не подходит, вам необходимо изменить его в своей учетной записи CheckUpDown (начните с нажатия кнопки «Управление»).

Ответы [ 5 ]

5 голосов
/ 18 апреля 2012

Google использует 302 Found для перенаправления на локализованную страницу.

Я думаю, это безопасно, если Google использует это ...

Однако всегда полезно проверить, что должен делать выбранный ответи для чего он предназначен и влияет ли он на кэширование:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

4 голосов
/ 01 декабря 2011

Вы можете использовать все языки под одним и тем же URL-адресом, а затем использовать согласование содержимого заголовка Accept-Language, но я бы не рекомендовал это.

Я бы предпочел, чтобы на корневом веб-сайте вашего сайта вы перенаправляли (303 - см. Другое) на языковую подстраницу (например, /en). Когда вы сделаете это, ответьте заголовком Vary, который указывает Accept-Language (и любые другие соответствующие заголовки, такие как Cookie). Таким образом, любые посредники (прокси, кэши) смогут кэшировать ответ. Я бы специально не выпустил 301, так как вы все еще хотите, чтобы ссылки указывали на корневой URL. На языковой странице я бы поставил rel="canonical" в корневой URL.

Смотрите также эти темы:

1 голос
/ 30 ноября 2011

Возможно HTTP 300 "Multiple Choices", поскольку технически это те же данные / документ, но доступны на нескольких языках?

1 голос
/ 30 ноября 2011

Я думаю, что вопросы больше связаны с тем, чего вы хотите достичь:

1: ваша страница индекса должна быть целевой страницей для вашего посетителя, и вы хотите, чтобы эта страница была проиндексирована поисковыми системами.

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

Минусы: у вас нет страниц контента для всех языков в поисковых системах.

2: Фактически переведенная страница должна бытьцелевую страницу, и, если возможно, ваши посетители должны попасть на переведенную страницу напрямую, если это возможно.Страница перенаправления предназначена только для посетителей, которые попали прямо на ваш сайт, введя имя хоста в адресную строку.

Плюсы: у вас есть несколько «целевых страниц» для каждого отдельного языка, что помогает в оценке и переходах по ссылкам.

Минусы: у вас нет общей целевой страницы.

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

Если вариант 1: используйте 302, потому что вы все еще хотите, чтобы он был частьюпоисковый индекс.Если вариант 2: используйте 301, потому что вы не хотите, чтобы эта страница была проиндексирована.Также можно использовать noindex на странице выбора языка.

Афаик, Google учитывает только 301, 302 и 307 (временное обслуживание), и я думаю, что все остальное рассматривается как 302 (кажется наиболее логичным).Что касается браузера, я думаю, это не имеет значения.Это может повлиять на кэширование, но я думаю, что в настоящее время они довольно агрессивны в кэшировании даже ответов 3xx.

0 голосов
/ 30 ноября 2011

HTTP 303, потому что он имеет наиболее подходящую формулировку - см. Другое (302-Перемещено временно и 301-Перемещено навсегда).На самом деле HTTP 303 ответ в этой ситуации, чтобы браузер веб-пользователя мог затем безопасно обновить ответ сервера, не вызывая повторную отправку исходного запроса HTTP POST.

...