2011-11-30 80 views
17

我想知道在語言重定向中我應該發送哪個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 status for functional redirect

也許300,301,302,303?爲什麼?

編輯

谷歌最近公佈的這個: http://googlewebmastercentral.blogspot.com/2011/12/new-markup-for-multilingual-content.html

我發現這一點:

HTTP狀態300個多種選擇

所請求的資源相對應的任何一個一套 陳述,每個都有自己的規範(或用戶代理)可以選擇優選表示並且將請求重定向到該位置。因此,可以提供代理驅動協商信息(部分12),以便用戶(或用戶代理)可以選擇優選表示並且將請求重定向到該位置。

除非是HEAD請求,響應應該包括含有的資源特性和從 位置(一個或多個)用戶或用戶代理可以選擇一個最合適的列表的實體 。 實體格式由Content- 類型標題字段中給出的媒體類型指定。取決於用戶代理的格式和功能

,最合適的選擇的選擇可以是自動執行的 。但是,本規範並未定義 這種自動選擇的任何標準。

如果服務器有一個首選的表示形式,它應該在 字段中包含該表示的特定URI;用戶代理可以使用位置字段值進行自動 重定向。除非另有說明,否則此響應可緩存。

而且這樣的:

HTTP錯誤300 - 多種選擇

介紹

你的Web服務器認爲,客戶端提供的網址(例如,您的 Web瀏覽器或我們的CheckUpDown機器人)不夠具體,需要進一步選擇多種選擇。

這通常是這樣的情況,其中URL代表需要進行哪些較低級別選擇的高級別分組。一個 目錄,在該目錄中用戶必須選擇一個特定的文件以訪問 。HTTP循環

300錯誤

任何客戶端(例如Web瀏覽器或我們的CheckUpDown機器人) 通過以下週期,當它與Web服務器通信:

獲得的IP地址該網站的IP名稱(該網站的URL爲 ,沒有前導'http://')。此查找(IP地址轉換爲IP地址爲 )由域名服務器(DNS)提供。打開IP地址的IP 套接字連接。通過該套接字寫入HTTP數據流 。接收來自Web 服務器的HTTP數據流作爲響應。該數據流包含狀態碼,其值由HTTP協議確定。解析這個數據流爲 狀態碼和其他有用的信息。當客戶端收到一個 識別爲「300」的HTTP狀態代碼時,上述最後一步中發生此錯誤。

固定300個錯誤 - 一般

你應該做的第一件事是檢查你的URL在Web瀏覽器。如果 您看到某種網頁會提示您進一步操作/選擇 動作/選擇,那麼您的URL現有網頁服務器要處理的 不夠詳細。

固定300個錯誤 - CheckUpDown

你不應該看到這個錯誤在您的CheckUpDown帳戶,如果你 給我們的頂級網址(如www.isp.com)檢查。如果頂級URL發生 ,則極有可能是Web服務器 軟件被錯誤地編程或配置。如果您有 給我們一個低級別的URL(如www.isp.com/products/index.html)到 檢查,那麼很可能這個URL即使通過 網絡瀏覽器也無法訪問。

您應該做的第一件事是在Web瀏覽器中檢查您的URL。如果 您看到一個明智的網頁,那麼它可能表示我們的 軟件中存在缺陷。但是,如果您看到某種網頁會提示您進一步採取行動/選擇,那麼您的網址不適合我們檢查,因爲我們的系統不可能做出這種選擇。

無論何時遇到 300錯誤,請直接與我們聯繫(電子郵件首選)。只有我們可以爲你解決它們。如果我們的軟件 存在缺陷,我們將對其進行修復。但是,如果您的URL從根本上不適合我們使用 ,則需要在您的CheckUpDown帳戶中更改它(從 開始單擊'管理'按鈕)。

回答

0

HTTP 303,因爲它具有最合適的公式 - 見其他(302-暫時移動,301-永久移動)。 在這種情況下,實際上是HTTP 303響應,以確保Web用戶的瀏覽器可以安全地刷新服務器響應,而不會導致重新提交初始HTTP POST請求。

+1

所有的選擇中,303是一個絕對不正確。 例如,如果將PUT添加到協商資源,則不希望HTTP庫在重定向後將請求更改爲GET。 –

1

可能HTTP 300 "Multiple Choices",因爲它在技術上是相同的數據/文件,但可用多種語言?

+0

我認爲你是對的。 –

+2

如果協商失敗,則應使用300狀態碼以列出所有選項的文檔進行響應。 – Gumbo

+0

是的 - 但是這不是正在做什麼(看代碼)?如果語言是從HTTP_ACCEPT_LANGUAGE中自動檢測的,那就這樣做 - 否則有一條評論指出「//顯示默認網站或提示語言」......這是「提示語言」位,這讓我認爲300會是「正確」......雖然和編程中的幾乎任何東西一樣,總是有多個值「right」;) – CD001

1

我認爲,問題是你想達到什麼更多相關:

1:您的索引頁應該是爲你的訪問者的登陸頁面,並且希望該網頁被搜索引擎收錄。

優點:您的所有訪問者都有一個入口頁面,可在實際登錄頁面之前託管更多信息。但是,它不會有特定語言的內容。

缺點:您沒有任何搜索引擎上所有語言的內容頁面。

2:實際翻譯的頁面應該是登錄頁面,如果可能的話,如果可能的話,訪問者應該直接在翻譯的頁面上結束。重定向頁面僅適用於通過在地址欄中輸入主機名直接訪問您的站點的訪問者。

優點:每個語言都有多個「着陸頁」,有助於評分和點擊。

缺點:您沒有通用的登錄頁面。

這兩個選擇有更多的優點和缺點,但現在我想不起來。

如果選項1:使用302,因爲您仍然希望它成爲搜索索引的一部分。 如果選項2:使用301,因爲您不希望將該頁面編入索引。或者,在語言選擇頁面上使用noindex。

Afaik,谷歌只考慮到301,302和307(臨時維護),我認爲它認爲其他一切都是302(看起來最合理)。就瀏覽器而言,我認爲這並不重要。它可能會影響緩存,但我認爲現在他們在緩存3xx響應方面非常積極。

+0

我希望在每個語言搜索索引中爲每個語言頁面建立索引。 (即在西班牙語搜索中返回/ es /,在英語中搜索返回/ en /)。你認爲我應該有/作爲默認語言的主頁嗎?我應該使用rel = canonical嗎? – jrosell

+0

如果需要,您可以使用canonical,但不一定。如果您始終將訪問者重定向到301,Google只會將語言網址編入索引。 – jishi

+0

你認爲根據內容談判有301有意義嗎? – jrosell

4

您可以在同一網址下使用各種語言,然後使用Accept-Language標題的內容協商,但我不會推薦這麼做。

我寧願建議在你的網站的根網址,你發出重定向(303 - 見其他)到語言子頁面(例如/en)。當您這樣做時,請使用Vary標題進行回覆,該標題指定Accept-Language(以及任何其他相關標題,例如Cookie)。這樣,任何中介(代理,緩存)都可以緩存響應。我會專門而不是發出301,因爲你仍然想要鏈接指向根網址。在特定於語言的頁面上,我會將rel="canonical"添加到根網址。

參見這些線程:

+0

我會研究這2個鏈接,但現在...是否有可能輸出'每種語言的位置標題'列表並讓瀏覽器決定? – jrosell

+0

瀏覽器已經以某種方式決定了它在請求中發送了一個優先級列表('Accept-Language'頭部)。 'Vary:Accept-Language'響應頭部指定這是決定的基礎。 – troelskn

+0

你確定Vary標題是必需的嗎?我沒有看到任何使用Accept-Language Vary標題進行響應的多語言站點。 – Jordy

4

谷歌使用302 Found重定向到本地化頁面。

我認爲Google使用它是安全的...

然而,這是一件好事,檢查什麼選擇的響應應該做的,它是用來幹什麼的,並不會影響緩存:

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