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

时间:2011-10-04 15:43:19

标签: php http-referer

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

但正如我所说,我希望在我浏览网站的同时保留它 - 我已经看过设置会话但是我也无法让它工作 - 一旦我开始导航,引用者总是会改变。

我很欣赏这有点模糊,但我尝试了很多代码示例,他们似乎都有同样的问题。

非常感谢任何帮助。

由于

4 个答案:

答案 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>';
}