2012-11-29 98 views
1

我有兩種語言(希伯來語和英語)的WordPress網站,我需要它根據瀏覽器語言重定向。我使用qTranslate插件以兩種語言創建內容。這個插件也具有重定向功能,但它僅爲首頁創建重定向,我需要重定向發生在內部頁面以及主頁上。網址重定向無法正常工作:遺傳網址http://domain.com/domain.com/

另一位開發人員爲我寫了這段代碼來創建重定向,但由於某種原因它創建了一個有趣的重定向。它只有在將語言切換到希伯來語時纔會發生,然後離開該網站並嘗試直接進入http://domain.com/en/,並將您重定向到http://domain.com/domain.com/(切換到英語時不會發生)。

我嘗試使用創建希伯來文重定向的「header(Location:)」,但無法弄清楚如何使其工作 - 我嘗試使用完整路徑而不是相對路徑,或刪除「 /「在$_SERVER['SERVER_NAME']$_SERVER['REQUEST_URI']之間,但得到帶有雙」/「(http://domain.com//以及內部頁面http://domain.com//page)的遞歸url或url。

的URL結構是:

  • domain.com/希伯來語
  • domain.com/en/英語

和切換語言時,那麼參數$ LANG = EN或$ lang =他正在被添加。

希望這是有道理的,並且非常感謝!

這是代碼,負責重定向:

<?php 
if (!isset($_COOKIE["uln"])) : 
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); 
setcookie('uln', $lang, time()+86400*365, '/', '.domain.com'); // cookie stored for a year 
$_COOKIE['uln'] = $lang; 
endif; 

//if lang=(value) is not empty 

if(isset($_GET['lang'])) { 
$lang = $_GET['lang']; 

setcookie('uln', $lang, time()-1, '/', '.domain.com'); //this unsets the cookie for random language selection 

//set the cookie "uln" again with the selected language. 
setcookie('uln', $lang, time()+86400*365, '/', '.domain.com'); // cookie stored for a year 
$_COOKIE['uln'] = $lang; 
} 



     if(($_COOKIE["uln"]) == "en") { 
     $matched = strncmp("/en/", $_SERVER['REDIRECT_URL'], 3);        
     if ($matched !== 0) :  
     header('Location: /en'.$_SERVER['REQUEST_URI']);   
     endif; 
    } elseif(($_COOKIE["uln"]) == "he") { 
     $matched = strncmp("/en/", $_SERVER['REDIRECT_URL'], 3);        
     if ($matched === 0) :  
     header('Location: '.$_SERVER['SERVER_NAME'].'/'.$_SERVER['REQUEST_URI']);  
     endif; 
    } 

?> 

回答

2

代替

header('Location: '.$_SERVER['SERVER_NAME'].'/'.$_SERVER['REQUEST_URI']);  

嘗試

header("Location: http://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}"); 

網址,尤其是那些在位置頭,應包括協議和域名。我認爲位置標頭中的相對網址違反了HTTP RFC。

通過省略一個協議,你無意中指定了一個相對的url而不是絕對的url。

編輯:REQUEST_URI已經以/作爲前綴,因此在concat中包括一個是不必要的。

+0

呀,謝謝。我嘗試過這個。它會導致一個URL,其中//子庫/ en /是。我在htaccess文件中添加了一個重寫規則來刪除雙「/」,但這是一個臨時解決方案。我寧願它正常工作,沒有額外的解決方法。 – User24578

+0

您可能不需要在concat中包含'/'。'header(「Location:http:// {$ _SERVER ['SERVER_NAME']} {$ _SERVER ['REQUEST_URI']}」);'。如果直接使用curl或瀏覽器調試工具檢查HTTP響應,很容易看出這種情況。 –

+0

太好了。完美的作品!謝謝! – User24578

1

你錯過了一個http://的地方,可能是在英語 - >希伯來文重定向代碼。

變化

header('Location: '.$_SERVER['SERVER_NAME'].'/'.$_SERVER['REQUEST_URI']); 

header('Location: http://'.$_SERVER['SERVER_NAME'].'/'.$_SERVER['REQUEST_URI']); 
+0

謝謝,做到了。看看我寫給弗蘭克:) – User24578