$ _SERVER ['HTTP_REFERER']丢失了

时间:2012-09-11 12:22:30

标签: php

我想在我的网站中使用$_SERVER['HTTP_REFERER'],但我得到以下内容:

Notice: Undefined index: HTTP_REFERER 

我尝试过打印$_SERVER。这输出如下:

Array
(
    [HTTP_HOST] => 192.168.1.10
    [HTTP_USER_AGENT] => Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => en-us,en;q=0.5
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_CONNECTION] => keep-alive
    [PATH] => /sbin:/usr/sbin:/bin:/usr/bin
    [SERVER_SIGNATURE] => Apache/2.2.3 (CentOS) Server at 192.168.1.10 Port 80
    [SERVER_SOFTWARE] => Apache/2.2.3 (CentOS)
    [SERVER_NAME] => 192.168.1.10
    [SERVER_ADDR] => 192.168.1.10
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 192.168.1.77
    [DOCUMENT_ROOT] => /var/www/html
    [SERVER_ADMIN] => root@localhost
    [SCRIPT_FILENAME] => /var/www/html/sandeep/test/hash.php
    [REMOTE_PORT] => 53851
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /sandeep/test/hash.php
    [SCRIPT_NAME] => /sandeep/test/hash.php
    [PHP_SELF] => /sandeep/test/hash.php
    [REQUEST_TIME] => 1347365919
)

任何人都可以帮助我找到HTTP_REFERER或建议替代HTTP_REFERER吗?

7 个答案:

答案 0 :(得分:39)

来自文档:

  

将用户代理引用到的页面地址(如果有)   当前页面。这是由用户代理设置的。并非所有用户代理都会   设置这个,有些提供修改HTTP_REFERER的能力   特征。简而言之,它无法真正被信任。

http://php.net/manual/en/reserved.variables.server.php

答案 1 :(得分:28)

当网络浏览器从一个网站移动到另一个网站以及网站的页面之间时,它可以选择传递它来自的网址。这称为HTTP_REFERER,因此,如果您不从一个页面重定向到另一个页面,则可能缺少该页面

如果已设置HTTP_REFERER,则会显示它。如果不是那么你什么都看不到。如果未设置并且您将错误报告设置为显示通知,则会看到类似的错误:

 Notice: Undefined index: HTTP_REFERER in /path/to/filename.php

要在通知开启时防止此错误(我总是在通知开启的情况下开发),您可以这样做:

  if(isset($_SERVER['HTTP_REFERER'])) {
      echo $_SERVER['HTTP_REFERER'];
   }

 echo isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';

使用$ _SERVER ['HTTP_REFERER']超全局变量将HTTP_REFERER变量用于记录等目的非常有用。然而,重要的是要知道它并不总是这样设置,所以如果您使用通知进行编程,那么您需要在代码中允许这样做

答案 2 :(得分:8)

您可以而且绝不应该假设$_SERVER['HTTP_REFERER']会出现。

如果您控制上一页,则可以将URL作为参数"site.com/page2.php?prevUrl=".urlencode("site.com/page1.php")传递。

如果你不控制页面,那么你无能为力。

答案 3 :(得分:6)

Referer不是compulsory header。它可能存在也可能不存在或可能被修改/虚构。依靠它自担风险。无论如何,你应该打包你的电话,这样你就不会得到一个未定义的索引错误:

$server = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";

答案 4 :(得分:2)

解决方案

正如其他人很好地指出的那样,HTTP_REFERER是由用户的本地计算机(特别是浏览器)设置的,这意味着它的安全性不可靠。但是,这仍然完全是 Google Analytics(分析)监视您从何处获取访问者的方式,因此,检查,排除,包含等实际上对您很有用。

如果您认为应该看到HTTP_REFERER而没有,请将其添加到您的PHP代码中,最好在顶部:

ini_set('session.referer_check', 'TRUE');

当然,更合适的长期解决方案是实际更新php.ini或等效文件。不过,这是一种不错的快速验证方式。

测试

在您的网站上运行print($_SERVER['HTTP_REFERER']);,转到google.com,检查一些文本,将其编辑为<a href="https://example.com">LINK!</a>,应用更改,然后单击链接。如果一切正常,那么一切都很好,并且运行正常!

但是$ _SERVER可能是错误的,或者上面的测试表明它已损坏。以此更新您的页面,然后再次测试...

<script type="text/javascript">
    console.log("REFER!" + document.referrer + "|" + location.referrer + "|");
</script>

用途

我使用HTTP REFERER阻止GoogleAnalytics中的垃圾邮件站点。下面的图表着重介绍了一个特定网站的引荐。一天从0​​到44,这不是真正的用户造成的。这是因为一个受感染的网站试图引起我的注意力来购买他们的服务。但这只是开始,因为php.ini已更新为忽略引荐来源网址,这意味着这些垃圾邮件,垃圾网站没有收到适当的错误403,“访问被拒绝”。

答案 5 :(得分:0)

function redirectHome($theMsg, $url = null, $seconds = 3) {
    if ($url === null) {
        $url  = 'index.php';
        $link = 'Homepage';
    } else {
        if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] !== '') {
            $url = $_SERVER['HTTP_REFERER'];
            $link = 'Previous Page';
        } else {
            $url = 'index.php';
            $link = 'Homepage';
        }
    }
    echo $theMsg;
    echo "<div class='alert alert-info'>You Will Be Redirected to $link After $seconds Seconds.</div>";
    header("refresh:$seconds;url=$url");
    exit();
}

答案 6 :(得分:-7)

$_SERVER['HTTP_REFERER']

失败,请尝试

getenv('HTTP_REFERER')

这可能适合你。