【问题标题】:PHP HTTP_REFERRER - how to detect last page?PHP HTTP_REFERER - 如何检测最后一页?
【发布时间】:2009-07-27 10:23:31
【问题描述】:

我需要检测用户刚刚从哪里点击 - 因为我的 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),则不需要页眉/页脚包装器。

清楚吗? :o

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

【问题讨论】:

    标签: php session-variables http-referer


    【解决方案1】:

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

    编辑:

    所以 about/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';
    }
    

    【讨论】:

      【解决方案2】:

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

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

      你肯定必须找到一种更好/更安全/更可靠的方法来做你需要的事情。

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

      也许更简单的方法是在您的 Ajax 请求中添加一个参数,说明它来自哪里?即,不要依赖 PHP 脚本中的 Referer,只需查看请求中的一个参数,该参数将充当某种“引用者”,但由您放置?

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


      最后,你也这么说:

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

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

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

      【讨论】:

      • 是的,我认为 Vex 的解决方案非常棒,我没想到它这么简单!感谢您的帮助:)
      【解决方案3】:

      为什么不直接在服务器上创建静态页面而不使用 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';
      }
      

      【讨论】:

      • 这个想法是为了避免在内容发生变化时一直重新编码静态页面。这样,我可以根据请求的来源以不同的方式显示相同的内容。为代码编辑干杯,我明白你的意思。
      • 是的,我的意思是,对于动态页面来说,它不一定必须使用 AJAX。因此您可以在服务器上生成“静态”个人资料页面,它们是静态的,因为它们在初始页面加载后不会更改,但它们是动态的,因为它们仍然会在其中加载您的个人资料。
      【解决方案4】:

      大苦丁-

      如果你像这样格式化你的链接:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多