【问题标题】:PHP: Best way to forward a user to a different URL dynamicallyPHP:动态将用户转发到不同 URL 的最佳方式
【发布时间】:2011-09-03 08:54:52
【问题描述】:

我正在帮助建立一个网站,该网站将在同一域上托管不同地区的内容。比如:

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

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

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

我正在考虑使用$_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 } ?>

所以&lt;script&gt; 标签会放在文档开始之前...不是一个好主意!

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

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

【问题讨论】:

  • 如果您在发送任何输出之前放置语言检测功能 - eg 在渲染模板之前,或者在 &lt;!DOCTYPE ...&gt;&lt;html xmlns="..."&gt;... 之前,如果您使用平面脚本(不是 MVC)——您仍然可以发送位置,然后使用 exit() 来停止执行任何不必要的操作。
  • @jwandborg,问题是如果没有设置Cookie,我想在页面加载后运行一些Javascript,并且我无法放置必要的JS(来自“else ") 在文档加载之前... :-/
  • 您无法将用户重定向到与您要求语言相同的页面加载中的正确页面,您必须假设他们先说英语,然后再进行对话。此代码可以存在于文档中的任何位置,但必须在任何输出之前执行 header() 语句。
  • How to make a redirect in PHP? 的可能重复项
  • @vartec,您可能应该在发表评论之前阅读整个问题。您还应该阅读您发布的链接的内容。我是帮助构建答案的那个问题的编辑之一。在这里,你需要这个:*facepalm*

标签: php javascript html regex


【解决方案1】:
<?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 添加检查。它会阻止执行其余代码。

【讨论】:

  • 我应该如何做“正确的本地化”?另外,这是什么意思:“抓住该区域并使用该区域获取其余代码”?谢谢。
  • 哦,没关系。我虽然你正在尝试重定向页面。即使这是错误的。我已经把它删了。所以没关系。但代码应该可以工作。
  • 这回答了我的问题,但我担心可读性:-/ 不过我想不出另一种解决问题的方法!
【解决方案2】:

将以下代码或一些等效代码放在任何 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 并重新加载页面。

【讨论】:

  • 这充满了有用的想法,但它并没有真正解决我的问题。
  • 这是一个棘手的问题,今天是星期五,我今晚没睡够,你看到我对你帖子的评论了吗?我基本上在想 Gokhan Ozturk 发布的内容。
  • 没问题。反正我给你+1了。
【解决方案3】:

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

【讨论】:

  • 这实际上并不能以任何方式解决问题。在他们回访时,我仍然想检查他们的偏好而不是唠叨他们。
  • 感谢您在尝试帮助您时投反对票 :')。我们不了解对方。
  • 我已尽我所能解释您为什么不回答我的问题。我不确定我还能做些什么来帮助您改进答案。
  • 您的回答对我的问题没有多大帮助。如果你编辑它,它就是这样,我会改变我的投票。这就是这个网站的运作方式。
  • @Guus:尽量不要亲自投票。这表明答案如何适合问题,而不是个人侮辱。当然,无论内容价值如何,都不要就否决投票发出广泛的最后通牒——这不是我们想要在这里培养的社区。在试图交换信息时,报复是一种毫无意义的策略。我建议您在此处讨论所提供的上下文中考虑 Django 的原始问题,并确定编辑后的答案是否更适合。
【解决方案4】:

这其实很简单。

在脚本的开头(在任何 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');

 ?>

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

【讨论】:

  • 或者更好:header("Location: ?language=" . $locationCookie) 以获得更动态的重定向。
  • OP不使用GET参数而是使用URI路径("folder")来确定语言。
  • 这根本解决不了问题,想想吧。
  • 您刚刚向我解释了如何使用Location。恐怕我已经知道了,问题出在模态窗口的逻辑上。请参阅我的编辑:)
猜你喜欢
  • 2021-12-13
  • 2013-11-07
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 2010-10-02
  • 2011-01-15
相关资源
最近更新 更多