2011-11-30 17 views
17

Zastanawiam się, który kod stanu HTTP powinienem wysłać w przekierowaniach językowych.Kod stanu HTTP przekierowania języka

Mam następujący kod php do przekierowania przez nagłówki HTTP do najważniejszego języka w nagłówku przeglądarki 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/"); 

?> 

Powiązane pytanie: HTTP status for functional redirect

Może 300, 301, 302, 303? Czemu?

EDIT

Google niedawno opublikowane w tym: http://googlewebmastercentral.blogspot.com/2011/12/new-markup-for-multilingual-content.html

Znalazłem to:

stan HTTP 300 Multiple Choices

Żądany zasób odpowiada któregokolwiek z zestaw reprezentacji , każdy z własną specyfikacją informacje o lokalizacji i informacje o negocjowanych informacjach o agentach (sekcja 12) są dostarczane, aby użytkownik (lub użytkownik) mógł wybrać preferowaną reprezentację, a następnie przekierować żądanie do tej lokalizacji.

O ile nie było to żądanie HEAD, odpowiedź POWINNA obejmować jednostkę zawierającą listę właściwości i lokalizacji zasobów z , którą użytkownik lub agent użytkownika może wybrać najbardziej odpowiedni. Format jednostki encji jest określany przez typ nośnika podany w polu nagłówka Content-Content ID- . W zależności od formatu i możliwości klienta użytkownika wybór najbardziej odpowiedniego ustawienia MOŻE być wykonywany automatycznie. Jednak ta specyfikacja nie definiuje żadnego standardu dla takiego automatycznego wyboru.

Jeśli serwer ma preferowany wybór reprezentacji, POWINIEN BYĆ NALEŻY zawierać konkretny identyfikator URI dla tej reprezentacji w polu Lokalizacja ; agenty użytkownika MOGĄ używać wartości pola Lokalizacja do automatycznego przekierowania. Ta odpowiedź jest buforowana, chyba że wskazano inaczej.

I tak:

Błąd HTTP 300 - Wiele wybory

Wprowadzenie

Serwer WWW uważa, że ​​adres URL dostarczonych przez klienta (np przeglądarka Web lub nasz CheckUpDown robota) nie jest wystarczająco specyficzny, a dalsza selekcja musi być dokonana z wielu opcji.

Zwykle ma to miejsce, gdy adres URL reprezentuje wysoki poziom grupowania, z których należy dokonać wyboru niższego poziomu, np. katalog, w którym użytkownik musi wybrać określony plik, aby uzyskać dostęp do dostępu .

300 błędy w cyklu HTTP

Każdy klient (np przeglądarka internetowa lub nasza CheckUpDown robota) idzie przez następnego cyklu, gdy komunikuje się z serwerem WWW:

uzyskać adres IP z Nazwa IP witryny (adres URL witryny bez wiodącego "http: //"). To wyszukiwanie (konwersja nazwy IP na adres IP ) jest dostarczane przez serwery nazw domen (DNS). Otwórz połączenie gniazda IP z tym adresem IP. Przepisz strumień danych HTTP przez to gniazdo. Odbierz strumień danych HTTP z powrotem z serwera WWW w odpowiedzi. Ten strumień danych zawiera kody stanu, których wartości są określane przez protokół HTTP. Przetwórz ten strumień danych pod kątem kodów stanu i innych przydatnych informacji. Ten błąd występuje w ostatnim kroku, gdy klient otrzymuje kod statusu HTTP, który rozpoznaje jako "300".

Mocowanie 300 błędy - ogólne

Pierwszą rzeczą, jaką należy zrobić, to sprawdzić adres URL w przeglądarce internetowej. Jeśli pod numerem zobaczysz stronę sieci Web z monitem o dalszą działanie/opcje, twój adres URL w takiej postaci nie jest wystarczająco szczegółowy, aby serwer WWW mógł go przetworzyć.

Mocowanie 300 błędy - CheckUpDown

Nigdy nie należy tego błędu na koncie CheckUpDown jeśli dał nam adres URL najwyższego poziomu (takich jak www.isp.com) do sprawdzenia. Jeśli wystąpi on w przypadku adresu URL najwyższego poziomu, jest wysoce prawdopodobne, że oprogramowanie serwera WWW zostało niepoprawnie zaprogramowane lub skonfigurowane. Jeśli masz , podając nam niskopoziomowy adres URL (np. Www.isp.com/products/index.html) do sprawdzenia , to prawdopodobnie ten adres URL nie będzie dostępny nawet przez przeglądarkę internetową .

Najpierw należy sprawdzić adres URL w przeglądarce internetowej. Jeśli widzisz rozsądną stronę internetową, może to oznaczać usterkę w naszym oprogramowaniu . Jeśli jednak pojawi się strona internetowa z monitem o dalsze działania/wybory, adres URL nie będzie dla nas odpowiedni do sprawdzenia, ponieważ nasz system nie może dokonać takiego wyboru.

Skontaktuj się z nami bezpośrednio (e-mail preferowany) za każdym razem, gdy znajdziesz 300 błędów. Tylko my możemy je dla ciebie rozwiązać. Jeśli wystąpi usterka w , nasze oprogramowanie to naprawimy. Jeśli jednak Twój adres URL jest zasadniczo nieodpowiedni dla nas do korzystania z , musisz go zmienić na swoim koncie CheckUpDown (zacznij od kliknięcia przycisku "Zarządzaj").

Odpowiedz

0

HTTP 303, ponieważ ma najbardziej odpowiednią formułę - Zobacz Inne (302-przeniesiono tymczasowo i 301 - Przeniesiono na stałe). Właściwie odpowiedź HTTP 303 w tej sytuacji, aby upewnić się, że przeglądarka internetowa użytkownika może bezpiecznie odświeżyć odpowiedź serwera, nie powodując ponownego zgłoszenia początkowego żądania HTTP POST.

+1

Spośród wszystkich wyborów, 303 to taka, która jest zdecydowanie błędne. Na przykład, jeśli PUT do wynegocjowanego zasobu, nie chcesz, aby biblioteka HTTP zmieniała żądanie na GET po przekierowaniu. –

1

Prawdopodobnie jest to HTTP 300 "Multiple Choices" ponieważ technicznie są to te same dane/dokumenty, ale są dostępne w wielu językach?

+0

Myślę, że masz rację. –

+2

Kod stanu 300 powinien być użyty do odpowiedzi na dokument zawierający listę wszystkich wyborów, jeśli negocjacja nie powiodła się. – Gumbo

+0

Tak - ale czy to nie jest to, co się robi (patrząc na kod)? Jeśli język zostanie automatycznie wykryty z HTTP_ACCEPT_LANGUAGE, to zrób to - w przeciwnym wypadku pojawi się komentarz, który stwierdza "// pokaż domyślną stronę lub monit o język" ... to był ten "monit o język", który dał mi do myślenia, że ​​300 byłoby "right" ... chociaż, jak przy prawie wszystkim programowaniu, zawsze jest wiele wartości "right";) – CD001

1

Myślę, że pytania są podobne, co chcesz osiągnąć:

1: strona indeksu powinna być strona docelowa dla użytkownika, a chcesz tej stronie po być indeksowane przez wyszukiwarki.

Zalety: Masz jedną stronę początkową dla wszystkich użytkowników, którzy mogą umieścić dodatkowe informacje przed rzeczywistą stroną docelową. Jednak nie będzie zawierać treści dla określonego języka.

Minusy: Nie masz żadnych stron z treścią dla wszystkich języków w wyszukiwarkach.

2: Rzeczywista przetłumaczona strona powinna być stroną docelową, a jeśli to możliwe, użytkownicy powinni skończyć na przetłumaczonej stronie bezpośrednio, jeśli jest to możliwe. Strona przekierowania jest przeznaczona tylko dla użytkowników, którzy trafili prosto do Twojej witryny, wprowadzając nazwę hosta na pasku adresu.

Zalety: Masz wiele "stron docelowych" dla każdego języka, co ułatwia ocenianie i klikanie.

Minusy: Nie masz ogólnej strony docelowej.

Na te dwie opcje jest więcej zalet i wad, ale nie mogę o tym teraz myśleć.

Jeśli opcja 1: użyj numeru 302, ponieważ nadal chcesz, aby był częścią indeksu wyszukiwania. , jeśli opcja 2: użyj 301, ponieważ nie chcesz indeksować tej strony. Alternatywnie użyj noindex na stronie wyboru języka.

Afaik, Google bierze pod uwagę tylko, 301, 302 i 307 (tymczasowe utrzymanie), i myślę, że uważa wszystko inne za 302 (wydaje się najbardziej logiczne). Jeśli chodzi o przeglądarkę, myślę, że to nie ma znaczenia. Może to wpływać na buforowanie, ale uważam, że obecnie są dość agresywni w buforowaniu nawet 3-krotnych odpowiedzi.

+0

Chcę, aby każda strona językowa była indeksowana w każdym indeksie wyszukiwania języka. (tj. wyszukiwanie w zwrotach/es /, zwroty w języku angielskim/en /). Czy uważasz, że powinienem mieć/jako stronę główną domyślnego języka? Czy powinienem wtedy użyć rel = canonical? – jrosell

+0

Możesz użyć kanonicznych do tego, jeśli chcesz, ale niekoniecznie. Jeśli zawsze przekierujesz użytkowników do/en z 301, Google indeksuje tylko adresy URL języków. – jishi

+0

Czy uważasz, że ma sens mieć 301 zgodnie z negocjacją treści? – jrosell

4

Możesz używać wszystkich języków pod tym samym adresem URL, a następnie używać negocjacji treści nagłówka Accept-Language, ale nie polecam tego.

Wolałbym zasugerować, że na twoim adresie URL strony głównej, wydajesz przekierowanie (303 - Zobacz inne) do podstrony językowej (np. /en). Kiedy to zrobisz, odpowiedz na nagłówek Vary, który określa Accept-Language (i inne odpowiednie nagłówki, takie jak Cookie). W ten sposób każdy pośrednik (serwer proxy, pamięć podręczna) będzie w stanie buforować odpowiedź. Byłoby szczególnie nie wydać 301, ponieważ nadal chcesz, aby linki wskazywały na adres root. Na stronie specyficznej dla języka umieściłbym rel="canonical" w adresie URL katalogu głównego.

Zobacz również te wątki:

+0

Będę badać te 2 linki, ale na razie ... Czy można wydrukować listę "nagłówków lokalizacji dla każdego języka" i pozwolić przeglądarce decydować? – jrosell

+0

Przeglądarka już zdecydowała, w pewnym sensie, że wysłała listę priorytetów w żądaniu (nagłówek 'Accept-Language'). Nagłówek odpowiedzi 'Vary: Accept-Language' określa, że ​​było to podstawą decyzji. – troelskn

+0

Czy jesteś pewien, że nagłówek Vary jest potrzebny? Nie widzę żadnej witryny wielojęzycznej, która odpowiada nagłówkiem Accept-Language Vary. – Jordy

4

Google wykorzystuje 302 Found do przekierowania do miejscowego stronie.

Myślę, że to bezpieczne, jeśli Google go używa ...

jednak zawsze dobrze jest sprawdzić, co wybrana odpowiedź powinna zrobić i co to jest przeznaczone do a to wpływa na buforowanie:

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

Powiązane problemy