Подтвердить что ты не робот

Код состояния HTTP для перенаправления языка

Интересно, какой код статуса 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? Почему?

ИЗМЕНИТЬ

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

Я нашел это:

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

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

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

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

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

И это:

Ошибка HTTP 300 - Несколько вариантов

Введение

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

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

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

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

Получить IP-адрес от IP-адреса сайта (URL-адрес сайта без ведущего "http://" ). Этот поиск (преобразование 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 (начиная с нажав кнопку "Управление" ).

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

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

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

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

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

Ответ 5

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