HTTP_REFERER启动的HTML在整个网站上可见,而不仅仅是在最初的登录页上


HTTP_REFERER initiated HTML visible throughout website not just on the initial landing page

我一直在寻找解决我的问题的方法-我不是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 }  ?>

但正如我所说,我希望它在我浏览网站时保持不变——我曾考虑过建立一个会话,但我也无法实现——一旦我开始浏览,推荐人总是会改变。

我很感激这有点模糊,但我已经尝试了很多代码示例,它们似乎都有相同的问题。

任何帮助都将不胜感激。

感谢

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问题或服务器配置问题。。。

<?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",它包含由源站点创建的编码的referer url。这个参数是"粘性"的,并且一直在传递,所以在任何时候都可以返回到原始站点。也许对您来说,实施这样的方法会更好。

编辑:仔细观察,如果只有一个父站点和多个子站点,但没有多个父站点,则基于会话的方法可能只适用于这种特定情况!然而,在更复杂的情况下,会话会让你下地狱,所以我将保留这个答案。

这不是小事-

  • 您可以使用会话跨页面存储引用者目标,但如果用户从不同的引用者打开同一页面的多个实例,则会混淆这一点,这对可用性来说很糟糕

  • 或者在每个请求的同时发送一个唯一的密钥,指向正确的"返回"目标。(它也可能是base64或URL编码的URL本身,但这会使URL看起来又长又丑…(

后者是一种非常干净的方法,但要始终如一地实施起来很痛苦。

脑海中浮现的另一个(疯狂且未经测试(想法是在window.name属性中使用JavaScript存储引用者URL的base64编码表示。这方面的好处是,与cookie不同,它只存储当前窗口的"返回"目标我不能保证这会奏效,但如果你真的想这样做,可能值得跟进。

我一看到你的问题,就认为SESSION是关键。

您可以设置一个会话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>';
}
相关文章: