PHP:动态地将用户转发到其他URL的最佳方式

时间:2011-05-27 12:15:05

标签: php javascript html regex

我正在帮助整合一个网站,该网站将为同一个域中的不同区域托管内容。例如:

www.example.com/us/
www.example.com/uk/
www.example.com/fr/

我有一个系统,询问用户他们想要查看哪个网站(然后将他们的偏好存储在cookie中)。我的问题是:如果他们访问了一个网址(例如:www.example.com/us/contact.php)并且他们的偏好Cookie显示/ fr /,我该如何最好地将它们转发到www.example.com/fr/contact。 PHP?

系统可以读取他们所在的网站区域以及他们的Cookie所说的内容。所以我们知道的信息是:网站:美国和Cookie:FR。

我正在考虑使用$_SERVER['SCRIPT_NAME']并使用正则表达式从URL获取“contact.php”。然后使用header("Location: [url]");,但我知道如果任何文本已经传递给浏览器,则Location不起作用......这会产生各种各样的问题。

修改
这里有一些代码可以更清楚地解释这个问题:

<?php
// Get variable contents for $cookieRegion and $siteRegion
if($cookieRegion != '') { // If Cookie has been previous set
    if($cookieRegion != $siteRegion) { // If Cookie pref clashes with site URL
       // Forward to correct URL
    }
}
else { ?>
    <script type="text/javascript">
        $(document).ready(function(){
            // Display modal window asking user preference
        });
    </script>        
<?php } ?>

因此<script>标记会在文档开始之前放置......不是一个好主意!

解决这个问题的最佳方法是什么?

或者,有没有更好的方法来处理我可以实现的整个问题呢?

4 个答案:

答案 0 :(得分:2)

<?php
// Use this to open modal window.
$wrongRegion = FALSE;

// if there is a cookie...
if (isset($_COOKIE['region']))
{
    // I am using preg_match to ensure we are getting right parameters...
    // Sorry I am not good with Regex. You can set a better patern.
    preg_match("#/(.*?)/(.*?)\.php#is", $_SERVER['REQUEST_URI'], $m);

    // Okay! $m[1][0] is the region code on the uri. lets check if its same with cookie
    if ($_COOKIE['region'] != $m[1][0])
        $wrongRegion = TRUE;
}

....... (codes goes here)

// to where you put the modal window code:

if ($wrongRegion == TRUE)
{
    // put the modal window code.
}

所以你可以给preg_match添加一个检查。它阻止执行其余的代码。

答案 1 :(得分:1)

在任何HTML或换行符之前放置以下代码或一些等效代码。

<?php
# This will split the request URI into an array with all the components between slashes in the URI
$request_parameters = explode('/', $_SERVER['SCRIPT_URI']);

# Now, hopefully $request_parameters[1] contains the language abbreviation/code
if ( $request_parameters[1] != $cookieLanguage ) {
    # Replace the erroneous language with the language saved in the cookie, 
    # reassemble the URI and send the client to the correct location
    $request_parameters[1] = $cookieLanguage;
    header('Location: ' . implode('/', $request_parameters);
}

如果没有设置任何cookie

  1. 显示默认页面例如 /en-US/contact/
  2. 让客户选择语言
    • 如果客户选择语言;设置语言cookie并重新加载页面。

答案 2 :(得分:0)

首先读取cookie,然后解析用户想要去的地方(contact.php),然后在发送输出之前将其重定向到Location:所以在index.php的开头

答案 3 :(得分:-1)

这实际上很简单。

在你的脚本开头(在任何html之前......特别是标签!)沿着这些方向做点什么:

 <?

 if $locationCookie == 'fr') {

 header("Location: /fr");

 //or alternatively
 //header("Location: /fr/contact.php");

 }

 //also, let's say they are on the us/contact.php page and you want them to go to the fr/contact.php page

 header('Location: ../'.$language_cookie.'/contact.php');

 ?>

这样做会将用户重定向到他们当前所在的SAME PAGE,但语言的$ _GET变量将等于fr。然后,在您的页面中,您应该检查此变量并相应地进行适当的更改。