46

I want to use $_SERVER['HTTP_REFERER'] in my site but i get the following:

Notice: Undefined index: HTTP_REFERER 

I have tried printing $_SERVER. This outputs the following:

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
)

Can anyone help me to find HTTP_REFERER or suggest an alternative to HTTP_REFERER?

4

6 回答 6

49

从文档中:

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

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

于 2012-09-11T12:26:04.853 回答
36

当网络浏览器从一个网站移动到另一个网站以及在网站的页面之间移动时,它可以选择传递它来自的 URL。这称为 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 变量用于记录等目的可能很有用。但是,重要的是要知道它并不总是设置,因此如果您使用通知进行编程,那么您需要在您的代码中允许这一点

于 2012-09-11T12:24:53.460 回答
11

Referer 不是强制标头。它可能存在也可能不存在,或者可能被修改/虚构。依赖它,风险自负。无论如何,你应该包装你的电话,这样你就不会收到未定义的索引错误:

$server = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
于 2012-09-11T12:26:20.697 回答
9

你可以而且永远不应该假设它$_SERVER['HTTP_REFERER']会出现。

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

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

于 2012-09-11T12:24:35.220 回答
3

解决方案

正如其他人所说的那样,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,不是真实用户造成的。这是由于一个 botted 网站试图引起我的注意购买他们的服务。但它才刚刚开始,因为 php.ini 被更新为忽略引用者,这意味着这些垃圾邮件、垃圾垃圾站点没有得到相应的错误 403,“拒绝访问”。

于 2020-05-03T17:54:47.877 回答
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();
}
于 2016-11-06T08:07:25.770 回答