我一直在寻找解决问题的方法 - 我不是一个PHP新手,但我没有过多的经验。
我的问题是:
我有一组网站 - 一个是父网站。我想拥有它,这样如果我只从父网站点击我的任何子网站,就会出现一个回到父按钮(包含在div中)。如果我直接或从其他推荐人那里访问任何子站点,则该按钮不会出现。
我使用HTTP_REFERER工作,但是当我点击网站时,我希望按钮保持可见(显然,一旦我开始点击网站,推荐人就会改变)。
这适用于首次点击网站时出现的按钮:
<?php if (preg_match("~^http://www.mysite.com~i", $_SERVER['HTTP_REFERER'])) { ?>
<div><a href="http://www.mysite.com/">Back</a></div>
<?php } ?>
但正如我所说,我希望在我浏览网站的同时保留它 - 我已经看过设置会话但是我也无法让它工作 - 一旦我开始导航,引用者总是会改变。
我很欣赏这有点模糊,但我尝试了很多代码示例,他们似乎都有同样的问题。
非常感谢任何帮助。
由于
答案 0 :(得分:1)
编辑:仔细观察一下,如果只有一个父网站和多个子网站,但没有多个父网站,那么基于会话的方法可能只适用于这种特定情况!然而,在更复杂的情况下,会话会把你送到地狱,所以我会留下这个答案。
这不是一件容易的事 -
您可以使用会话来跨页面存储引荐来源目标,但如果用户从不同的引荐来源打开同一页面的多个实例,那将会感到困惑
或发送唯一键以及指向正确“后退”目标的每个请求。 (它也可能是base64或URL编码的URL本身,但这会使URL显得冗长而丑陋......)
后者是一种非常干净的方法,但要始终如一地实施。
另一个(疯狂且未经测试的)想法是使用window.name
属性中的JavaScript存储引用URL的base64编码表示。关于这一点的好处是,与cookie不同,它只为当前窗口存储“后退”目标。我不能保证这会起作用,但如果你有可能值得跟进真的很想这样做。
答案 1 :(得分:1)
<?php
session_start();
if (!isset($_SESSION["ref"])){
$_SESSION["ref"] = $_SERVER["HTTP_REFERER"]; //record first instance
} else if (isset($_SERVER["HTTP_REFERER"])){
$ref = $_SERVER["HTTP_REFERER"];
if ($ref != $_SESSION["ref"]){
$_SESSION["ref"] = $ref; // record new ref
}
}
if ($ref = $_SESSION["ref"]){
echo "<a href=\"$ref\">Back</a>
}
但我同意Pekka的说法,你应该使用自定义的site_id,这是在你导航你的网站时传递的。 HTTP_REFERER
上的转发通常是不安全的。如果您从两个子站点进入主站点,使用会话将使您遇到问题,因为会话将只保留最新的参考。
在我们的其他解决方案中,我们使用get param“current_ref”,它包含由源站点创建的编码引用URL。这个参数是“粘性的”,并且一直传递,所以在任何时候你都可以返回原始站点。也许你也可以更好地实施这种方法。
答案 2 :(得分:1)
HTTP_REFERRER确实是当前页面的最后一个引用者,因此您必须在第一次进入该站点时存储并启动会话。
会话通常是一个非常简单的主题,应该开箱即用:
session_start();
session_regenerate_id();
if (preg_match("~^http://www.mysite.com~i", $_SERVER['HTTP_REFERER'])) {
$_SESSION['parentsite'] = true;
}
稍后在您的代码中执行:
<?php if(isset($_SESSION['parentsite']) && $_SESSION['parentsite'] == true){ ?>
<div><a href="http://www.mysite.com/">Back</a></div>
<?php } ?>
现在,如果您的会话仍无法使用,则可能是COOKIE问题或服务器配置问题......
答案 3 :(得分:1)
一看到你的问题,我认为会话就是关键。
您可以设置会话cookie,然后测试以查看cookie是否已存在。
session_start();
if (preg_match("~^http://www.mysite.com~i", $_SERVER['HTTP_REFERER']) ||
isset($_SESSION['show_back_button']))
{
// Set the session value
$_SESSION['show_back_button'] = true;
echo '<div><a href="http://www.mysite.com/">Back</a></div>';
}