2009-07-27 31 views
1

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

如果是进入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请求 - 添加页眉/页脚包装

回答

3

是不是很容易,只需通过一个标志在你的AJAX调用告诉脚本要显示哪种类型的内容?

编辑:

所以关于/ staff-name.php显示内容。通过AJAX调用它作为about/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'; 
} 
+0

不,不这么认为 - 见上面,会编辑主帖:) – MrFidge 2009-07-27 10:35:13

+0

这么简单...非常感谢:D – MrFidge 2009-07-27 10:51:12

3

无论什么时候,引用站点是不是你应该在立足整个网站的信息:

  • 客户端:它是由客户端,这意味着(至少)发送不必向它发送
    • 它可以在浏览器中禁用
    • 有些防火墙/防毒删除
  • 可以伪造/改变(与Firefox一种简单的方法是使用一个扩展做到这一点)

您definitly必须找到一个更好的/ Saffer的/更可靠的方法做你的需要。

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

也许更简单的方法是将参数添加到您的Ajax请求,说它来自哪里?即,而不是依赖于PHP脚本中的Referer,只需查看请求中的参数,它可以作为某种“引用者”,但是由你来提供?

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


最后,你还要这样说:

1)如果AJAX请求 - 没有包装
2)如果 没有AJAX请求 - 添加页眉/ FO oter 包装

好吧,如果这是唯一的决定,如果PHP脚本是通过一个Ajax请求调用,这里也的事情,两种解决方案:

  • 一个参数添加到请求时,它的完成通过Ajax(您只需在执行请求的JS脚本中添加此参数;并且当参数在这里时,PHP知道它是一个Ajax请求)
  • 或者,在PHP脚本中,查找X-Requested-With HTTP标头,当通过Ajax调用请求时,此标头经常带有值XMLHttpRequest(但你应该检查它的设置与您的JS框架/或者它依赖于浏览器 - 不知道这一点:-()
+0

是的,我认为Vex的解决方案非常出色,我没有意识到它是那么简单!感谢您的帮助:) – MrFidge 2009-07-27 11:00:53

1

你为什么不只是建立在静态页面如果页面是静态的,你不应该有任何需要使用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'; 
} 
0

大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 
}