我正在帮助整合一个网站,该网站将为同一个域中的不同区域托管内容。例如:
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>
标记会在文档开始之前放置......不是一个好主意!
解决这个问题的最佳方法是什么?
或者,有没有更好的方法来处理我可以实现的整个问题呢?
答案 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
/en-US/contact/
答案 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。然后,在您的页面中,您应该检查此变量并相应地进行适当的更改。