【问题标题】:$_SERVER['HTTP_REFERER'] missing$_SERVER['HTTP_REFERER'] 丢失
【发布时间】:2012-09-11 12:22:29
【问题描述】:

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

【问题讨论】:

  • 您没有保证客户端会发送 http referer。如果没有提供,请不要使用它。
  • 感谢重播 有没有其他方法可以获取以前的站点名称?
  • 没有。引用者也可以被欺骗。
  • @ZaffyReally??你能解释一下程序吗!
  • 您始终可以使用 REMOTE_ADDR。我相信可以保证拥有从您的服务器请求文件的计算机的 IP 地址。其他 $_SERVER 变量都没有为我可靠地工作。 HTTP_REFERER 保证在你自己的服务器上工作,如果你没有抑制它,所以缺少 HTTP_REFERER 表明引用来自你的服务器之外。

标签: php


【解决方案1】:

来自文档:

将用户代理引至 当前页面。这是由用户代理设置的。并非所有用户代理都会 设置这个,有些提供修改 HTTP_REFERER 作为 特征。简而言之,它不能真正被信任。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 或者现在$_SERVER['HTTP_REFERER']??''
    【解决方案3】:

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

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

    【讨论】:

    • "compulsory" 不会出现在链接“强制标头”中。强制标头中存在哪些可以代替 HTTP_REFERER 的远程标识符?
    • @David Spector 如果您需要身份,您应该实施用户身份验证
    • 同意身份需要用户身份验证。但是,用户身份验证无法识别恶意用户和机器人,通常,用户身份验证可以防止公众查看自己的网站。就我而言,我希望我的网站能够被查看。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      解决方案

      正如其他人所说的那样,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>
      

      用途

      我在 GoogleAnalytics 中使用 HTTP REFERER 来阻止垃圾邮件网站。下图是针对某个特定网站的推荐的图表。一天从0​​到44,不是真实用户造成的。这是由于一个 botted 网站试图引起我的注意购买他们的服务。但它才刚刚开始,因为 php.ini 被更新为忽略引用者,这意味着这些垃圾邮件、垃圾垃圾网站没有得到相应的错误 403,“拒绝访问。”

      【讨论】:

        【解决方案6】:
        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();
        }
        

        【讨论】:

          猜你喜欢
          • 2012-09-27
          • 1970-01-01
          • 2017-04-09
          • 2023-03-31
          • 1970-01-01
          • 2010-11-26
          • 2012-04-13
          • 2015-09-06
          • 1970-01-01
          相关资源
          最近更新 更多