$_SERVER['HTTP_REFERER']缺失

49

我想在我的网站中使用$_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的替代方案吗?


2
你并没有保证客户端会发送HTTP Referer。如果没有提供,请不要与其交互。 - Zaffy
感谢回复 有没有获取上一个站点名称的替代方法? - Sandeep Solanki
1
不。Referer也可以被欺骗。 - Zaffy
@Zaffy真的吗?你能解释一下这个过程吗! - Deepak Singh
你可以随时使用REMOTE_ADDR。我相信它保证了你的服务器能够获取到请求该文件的电脑的IP地址。其他$_SERVER变量在我的经验中并不可靠。如果你没有禁用HTTP_REFERER,那么它保证能够在你自己的服务器上起作用,因此缺乏HTTP_REFERER 表明引用来自于你的服务器之外。 - David Spector
HTTP_REFERER不可靠。但如果你想使用,可以这样做:if (isset($_SERVER['HTTP_REFERER']){} - tejash patel
6个回答

50

从文档中可以得到以下信息:

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

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


39

当网络浏览器在网站之间或网站的页面之间切换时,它可以选择传递它来自哪个URL。这被称为HTTP_REFERER,如果你不从一个页面重定向到另一个页面,可能会丢失该信息。

如果HTTP_REFERER已设置,则会显示它。如果没有设置,您将看不到任何内容。如果它未设置并且您的错误报告设置为显示通知,那么您将看到类似以下的错误:

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

当开启通知(notices)时防止出现该错误(我总是在开发时开启通知),您可以这样做:

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

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

使用$_SERVER['HTTP_REFERER']超全局变量,利用HTTP_REFERER变量进行日志记录等目的可能非常有用。然而,重要的是要知道它并不总是设置的,因此如果您在编程时开启了提示,则需要在代码中做出相应处理。


1
甚至现在还有 $_SERVER['HTTP_REFERER']??'' - Brian Leishman

11

Referer不是一个强制性头信息。它可能存在,也可能不存在或被修改/虚假。依赖它需要自担风险。无论如何,您应该包装您的调用,以免出现未定义索引错误:

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

“强制性”在“强制性标头”中没有出现。哪些远程标识符存在于强制标头中,可以代替HTTP_REFERER使用? - David Spector
@David Spector 如果您需要身份验证,您应该实现用户认证。 - sijpkes
同意身份验证需要用户认证。然而,识别恶意用户和机器人不能仅通过用户认证完成,一般来说,用户认证会阻止公众查看网站。在我的情况下,我希望我的网站能够被浏览。 - David Spector

9

您不能并且也不应该假定 $_SERVER['HTTP_REFERER'] 总是存在。

如果您可以控制之前的页面,您可以将 URL 作为参数传递 "site.com/page2.php?prevUrl=".urlencode("site.com/page1.php")

如果您无法控制页面,则无能为力。


4

解决方案

正如其他人所说,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在Google Analytics中阻止垃圾网站。 下面是一个关注特定网站转介的图表。从第一天的0到44,这不是由真实用户引起的。它是由一个机器人网站引起的,试图引起我的注意来购买他们的服务。但是,这只是因为php.ini被更新为忽略referer,这意味着这些垃圾网站没有得到适当的ERROR 403,“拒绝访问”。


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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接