PHP HTTP_REFERER - 如何检测最后一页?

时间:2009-07-27 10:23:31

标签: php session-variables http-referer

我需要检测用户刚刚点击的位置 - 因为我的AJAX内容需要以不同的方式显示,具体取决于要插入的源页面。

如果要进入about.php它只需要数据,但是如果要进入about-main.php它需要是整个中间列,所以需要围绕数据的页眉/页脚包装。

通过AJAX调用的html保存在一个php页面中,该页面使用此代码查看谁在询问,然后适当地格式化HTML响应。

$array[] = "/cf/about.php";
$array[] = "/cf/about/about-main.php";
$array[] = "/cf/about/other-page.php";


$ispage = "";
foreach ($array as $value) {
    if ($_SERVER['HTTP_REFERER'] != $value) {
        $ispage = "";
    } else {
        $ispage = "woot";
    }
}
if ($ispage == "woot") {
        echo $content;
    } else {
        include_once 'about-header.php';
        echo $content;  
        include_once 'about-footer.php';
}

问题是...... HTTP_REFERER似乎有点受伤。我在网络上工作的时候工作得很好,但是我在家里的电脑上试过它,显然完全没能工作 - 结果太可怕了:o

还有另一种方法可以达到这个目的吗?我猜会话变量可以用,但后来我没有多少经验!

赞赏所有提示/提示;) 谢谢!

编辑:

该页面实际上是员工档案页面。它的正常位置是about.php,第二列div显示一个缩略图网格,点击它时,通过AJAX加载该地方的配置文件。所有简单 - 后退按钮重新加载照片网格。

问题是,每个工作人员还需要一个静态页面。我在about / staff-name.php创建了这些。但内容是相同的。我希望服务器检测是否有人直接访问about / staff-name.php,如果是,请在其周围打开页眉/页脚。

如果请求来自照片网格(即AJAX),那么它不需要页眉/页脚包装。

这是清楚的吗? :○

1)如果是AJAX请求 - 没有包装器 2)如果不是AJAX请求 - 添加页眉/页脚包装

4 个答案:

答案 0 :(得分:3)

在AJAX调用中传递一个标志来告诉脚本要显示哪种类型的内容会不会更容易?

编辑:

所以关于/ staff-name.php显示内容。通过AJAX将其命名为/ staff-name.php?FromAjax = 1

然后在about / staff-name.php文件中:

if (isset($_REQUEST['FromAjax']) ) {
    echo $content;
} else {
    include_once 'about-header.php';
    echo $content;  
    include_once 'about-footer.php';
}

答案 1 :(得分:3)

无论如何,Referer不是您应该以整个网站为基础的信息:它是由客户发送的,这意味着(至少):

  • 客户端不一定要发送它
    • 可以在浏览器中禁用它
    • 某些防火墙/防病毒程序将其删除
  • 它可以伪造/改变(firefox的一个简单方法是使用扩展来做到这一点)

你肯定必须找到更好/更好/更可靠的方式来做你需要的。

一个解决方案(您已经放弃了)将在您的所有链接中传递一个附加信息,说明请求来自哪个页面。在我看来,这可能是最好的事情......

也许更简单的方法是在Ajax请求中添加一个参数,说明它来自哪里?也就是说,不要依赖PHP脚本中的Referer,只需查看请求中的参数,它将作为某种“引用者”,但是由你提出?

它不会更安全(用户仍然可以使用该参数伪造请求),但是,至少,它不会被禁用/修改(除非用户这样做)手工)


最后,你也这样说:

  

1)如果是AJAX请求 - 没有包装器   2)如果   不是AJAX请求 - 添加页眉/页脚   包装

好吧,如果只是确定是否通过Ajax请求调用PHP脚本,这里也有两个解决方案:

  • 在通过Ajax完成时向参数添加一个参数(您只在执行请求的JS脚本中添加此参数;当参数在此处时,PHP知道它是一个Ajax请求)
  • 或者,在PHP脚本中,查找X-Requested-With HTTP标头,当通过Ajax调用发出请求时,该标头通常带有值XMLHttpRequest(但你应该检查它是否与你的JS Framework一起设置/或者它取决于浏览器 - 不确定:-()

答案 2 :(得分:1)

为什么不在服务器上创建静态页面而不使用ajax,包括页眉和页脚以及配置文件位?如果页面是静态的,则不需要使用javascript加载内容。

如果您确实需要使用javascript加载它,那么Vex的解决方案很好。您可以在ajax调用中传递一些可选参数来控制页面的呈现方式 - 这样,包含的页面不需要知道使用它的页面,它只需要了解告诉它如何呈现的参数本身。然后,您可以在以后更轻松地重复使用它。

我确实注意到你的代码中有错误 - 这可能无法正常工作:

$ispage = "";
foreach ($array as $value) {
    if ($_SERVER['HTTP_REFERER'] != $value) {
        $ispage = "";
    } else {
        $ispage = "woot";
    }
}

如果页面名称匹配,但下一个页面名称不匹配,则$ ispage将被设置回''。你可能最好做一些像:

$ispage = "";
foreach ($array as $value) {
    if ($_SERVER['HTTP_REFERER'] == $value) {
        $ispage = "woot";
        break;
    }
}

$ispage = '';
if (in_array($_SERVER['HTTP_REFERER'], $array)) {
    $ispage = 'woot';
}

答案 3 :(得分:0)

Tai kucing -

如果您将链接格式化为:

<a href="http://www.this-is-a-link.html?setvariablehere=yes">link</a>

然后php只需要这样:

if (isset($_REQUEST['setvariablehere']) ) {
    do something for when variable IS set
} else {
    do something for when variable IS NOT set
}