1

我有一个使用两种语言(希伯来语和英语)的 WordPress 网站,我需要它根据浏览器语言进行重定向。我正在使用 qTranslate 插件来创建两种语言的内容。这个插件也有一个重定向功能,但它只为主页创建一个重定向,我需要对内部页面和主页进行重定向。

另一位开发人员为我编写了这段代码来创建重定向,但由于某种原因,它创建了一个有趣的重定向。它仅在将语言切换为希伯来语时发生,然后离开站点并尝试直接进入http://domain.com/en/并将您重定向到http://domain.com/domain.com/(切换到英语时不会发生)。

我尝试使用为希伯来语创建重定向的“标题(位置:)”,但无法弄清楚如何使其工作 - 我尝试使用完整路径而不是相对路径,或删除和之间的“/ $_SERVER['SERVER_NAME']$_SERVER['REQUEST_URI']但得到递归 url 或带有双“/”的 url(http://domain.com//也适用于内部页面http://domain.com//page)。

网址结构为:

  • domain.com/ 用于希伯来语
  • domain.com/en/ 英文版

并且在切换语言时,将添加参数 $lang=en 或 $lang=he。

希望这是有道理的,非常感谢!

这是负责重定向的代码:

<?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;
   } 

 ?>  
4

2 回答 2

2

代替

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

尝试

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

URL,尤其是 Location 标头中的 URL,应包含协议和域名。我相信 Location 标头中的相对 URL 违反了 HTTP RFC。

通过省略协议,您无意中指定了相对 URL 而不是绝对 URL。

编辑: REQUEST_URI 已经以 a 为前缀,/因此在 concat 中包含一个是不必要的。

于 2012-11-29T00:24:38.497 回答
1

您错过了http://某个地方,可能是在英语 -> 希伯来语重定向代码中。

改变

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

header('Location: http://'.$_SERVER['SERVER_NAME'].'/'.$_SERVER['REQUEST_URI']);
于 2012-11-29T00:29:13.050 回答