2013-04-15 16 views
0

沒有頭文件已經發送,這是頁面上訪問的第一段代碼。在php中使用'header'加載時重定向的問題

我想提出一個多語種的網站和它具有非常小的文本正在嘗試將用戶重定向到基於他們的語言不同的目錄。我在php中寫過這樣的內容,每次我評估該網站時,我都會收到一個錯誤,並且不會加載。

$lang=$_SERVER['HTTP_ACCEPT_LANGUAGE']; 
$es=array("es", "es-es", "es-us", "es-mx"); 

if(array_key_exists($es, $lang)){ 
header('Location: http://www.site.com/es'); 
exit; 
}else{ 
header('Location: http://www.site.com'); 
exit; 
} 

在Firefox我收到錯誤「的Firefox已經檢測到服務器重定向此地址的請求的方式,將永遠不會完成。」

而且在Safari 「重定向過多發生試圖打開 「websitename」。當打開一個頁面將其重定向到另一個頁面時,會發生這種情況,打開頁面後,您將被重定向到另一頁面。

但我沒有在子文件夾中的語言檢查腳本的副本。當我使if語句非常簡單時if($lang =='es-es')它完美地工作。我的語法一定有問題,但我看不到它是什麼。

+0

這通常是當你重定向到一個頁面,該頁面已被重定向到其他地方發生,這推移和..可能是你把頁面上的這個條件檢查和重定向到頁面本身。這可能會導致每次執行腳本,它有點設置和無限循環的重定向... –

回答

1

使用in_array檢查,而不是 - 或者把你的字典數組哈希:

1)

if (in_array($lang, $es)){ 
    // ... 
} 

2)

$es = array_flip(array("es", "es-es", "es-us", "es-mx")); 
if (isset($es[$lang])) { 
    // ... 
} 

既然這樣,你的$es陣列是一個索引一個,但您正在嘗試在其密鑰中搜索 - 這些是簡單數字(0,1,2,3 ...)。

然而,有這裏的另一個問題。如果有人試圖訪問您的site.com,並且HTTP_ACCEPT_LANGUAGE標題中沒有es的任何變化,該怎麼辦?他們將再次被重定向到它... ...一次又一次,因爲每個隨後重定向是if條款重新檢查

解決的辦法是做一些默認頁面,其中不會檢查該語言設置;因此永久重定向循環將被打破。 )

+0

嘿,那是我第一次使用的命令和相同的效果:( –

+0

我什至沒有看到!我打破了現在循環,但問題是,我的瀏覽器有'es es'(確認與vardump),他們仍然被重定向到英文方 –

+0

好吧,你可以包括你的問題$ _SERVER ['HTTP_ACCEPT_LANGUAGE']的轉儲'? – raina77ow

0

您需要使用in_array代替array_key_exists

首先,試着這樣做: var_dump("<pre>", $lang); die(); ,看看你有什麼實際$lang獲得。

每什麼你得到,複製過去,到你$es數組值。

2

據我瞭解,如果錯誤,請糾正我,如果您在ELSE語句中,它將您重定向到同一站點,再次執行檢查,並再次重定向您,並再次導致無限循環。

0

這是因爲你一次又一次地將它重定向到同一頁面。嘗試重定向到其他頁面,如果您的條件變得錯誤或只是alert消息說語言找不到或類似的東西。

0

當我獲得您的問題...

更改這兩行

  $es=array("es", "es-es", "es-us", "es-mx"); 

      if(array_key_exists($es, $lang)){ 

與以下行

$es=array("es"=>es, "es-es"=>es-es, "es-us"=>es-us, "es-mx"=>es-mx); 

    if(array_key_exists($lang, $es)){ 

基本上在array_keys_exits($鍵,$數組名)函數有兩個參數傳遞&它是第一個參數是您要搜索的(鍵)值或Secon d參數是傳遞數組名稱。

我認爲你傳遞array_key_exits與空值作爲關鍵&錯誤的語法描述。

http://php.net/manual/en/function.array-key-exists.php