【问题标题】:HTTP_REFERER and Location redirectHTTP_REFERER 和位置重定向
【发布时间】:2011-11-07 17:31:38
【问题描述】:

我在这里找了一段时间,找不到我的具体问题的答案。

在我网站上的 100 个位置中,我通过标头位置重定向重定向到错误页面。

header("Location: /error.php");

我想要做的是在 error.php 页面上捕获并记录 HTTP_REFERER,但由于某种原因它没有设置。我已经看到了为什么没有使用 Meta-refresh 设置它的解释,但是位置标头是 302,所以应该设置正确吗?有什么想法吗?

请注意:我知道 HTTP_REFERER 是不可靠的,我知道我可以单独传递信息。在我的场景中,这两者都不重要(除非我想更改调用重定向的所有位置)。

【问题讨论】:

  • 一个问题是您不应该为Location: 标头使用相对路径。 RFC2616 说明位置标头:The field value consists of a single absolute URI。您必须使用新位置的绝对路径。您可以从 $_SERVER['HTTP_HOST']$_SERVER['PHP_SELF'] 动态计算此值,例如在这种情况下header('http://'.$_SERVER['HTTP_HOST'].'/error.php');
  • @DaveRandom - 谢谢 - 它确实有效
  • 虽然“它对您有效”,但它可能对其他人无效。重定向是否适用于相对路径取决于客户端/浏览器。是的,一些客户端确实使用相对路径,但规范统计它应该是一个绝对 URI(正如 @DaveRandom 指出的那样),所以一些客户端可能不那么适应。
  • 仅供参考,服务器变量拼写为 HTTP_REFERER 而不是 HTTP_REFERRER。见php.net/manual/en/reserved.variables.server.php

标签: php http-redirect


【解决方案1】:

实际上是HTTP_REFERER(中间有一个“R”)——一个卡住的拼写错误!

echo $_SERVER['HTTP_REFERER'];

【讨论】:

    【解决方案2】:

    某些浏览器不支持HTTP_REFERER。您可以使用isset() 函数,这一点非常重要,您必须使用HTTP_REFERER 而不是HTTP_REFERRER

    【讨论】:

      【解决方案3】:

      嗯,HTTP_REFERER 是由浏览器设置的,如果浏览器选择不在 302 重定向上设置它,这是不应该的,那么你就不会得到它。 302 是临时重定向,表示上一页暂时不可用。为什么浏览器要为现在不存在的页面发送信息?

      实现这一目标的好方法:

      • 就我个人而言,我有一个处理此类内容的错误类,而不是直接从页面重定向。这使您可以在重定向发生之前记录您需要的所有信息,甚至是调试信息。
      • 设置一个包含页面信息的会话,并在错误页面上抓取该信息进行记录。
      • 您可以尝试使用标头设置Referer 行,但有些浏览器会忽略这一点并且不会发送。

      真的没有办法解决这个问题,如果不修改你也想记录信息的每个重定向位置的代码。

      【讨论】:

      • 是否可以更改调用,以便它使用其他一些可以发送 http_referer 的 http 代码?这仍然会有很多变化,但要简单得多。
      • 你能在 URL 中传递引用者吗?无论哪种方式,听起来都可能是全局搜索和替换?
      猜你喜欢
      • 2013-07-28
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      相关资源
      最近更新 更多