【问题标题】:Message: Undefined index: REMOTE_HOST in $_SERVER消息:未定义的索引:$_SERVER 中的 REMOTE_HOST
【发布时间】:2010-11-14 18:03:47
【问题描述】:

为什么我在尝试检索远程用户的主机名时会收到此错误?

Message: Undefined index: REMOTE_HOST

阅读文档时,我知道需要在 httpd.conf 中启用它。但我不确定 httpd.conf 中需要编辑什么。

【问题讨论】:

  • 问题属于服务器故障? (尽管有 php 端的解决方法)
  • 你是在命令行调用 PHP 吗? REMOTE_HOST 不会被设置。

标签: php


【解决方案1】:

这不是错误,而是通知。并非在所有情况下都定义了 REMOTE_HOST。 REMOTE_ADDR 是。如果需要,您需要重新配置您的网络服务器。 HostnameLookups On 会这样做,但会导致速度变慢。

替代方案:让 PHP 进行查找,因此您可以在不需要时跳过它(以提高速度):

$r = $_SERVER["REMOTE_HOST"] ?: gethostbyaddr($_SERVER["REMOTE_ADDR"]);

【讨论】:

  • 如果 $_SERVER["REMOTE_HOST"] 未定义,这将导致 NOTICE 消息。在测试环境中,最好也去掉通知,因为在某些情况下它们很容易成为错误。 $r = array_key_exists( 'REMOTE_HOST', $_SERVER) ? $_SERVER['REMOTE_HOST'] : gethostbyaddr($_SERVER['REMOTE_ADDR']); 在这方面更好。除非必须,否则不要使用双引号,单引号执行得更快。
  • 如果关注 CLI 支持,可以使用空合并 ??。不,单引号“更快”是一个过时的误解:nikic.github.io/2012/01/09/…
  • 阅读 cmets 至少有 2 个例子表明单引号仍然更快 - phpbench.com
  • @Coder12345 我不关心微优化。任何使用过分析器的人都不会。
  • 如果这很慢,存储$_SESSION['REMOTE_HOST']=gethostbyaddr($_SERVER["REMOTE_ADDR"]) 的结果,然后改用$_SESSION
【解决方案2】:

$_SERVER 中的 REMOTE_HOSTPHP manual 表示:

您的网络服务器必须配置为 创建这个变量。例如在 Apache 你需要 HostnameLookups On 在 httpd.conf 中使其存在。

【讨论】:

    【解决方案3】:
    $r = $_SERVER["REMOTE_HOST"] ?: gethostbyaddr( $_SERVER["REMOTE_ADDR"]); // Will still cause the error/notice message
    

    为了避免应该使用的消息:

    $r = array_key_exists( 'REMOTE_HOST', $_SERVER) ? $_SERVER['REMOTE_HOST'] : gethostbyaddr( $_SERVER["REMOTE_ADDR"]);
    

    或者更简单的:

    $r = is_set( $_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : gethostbyaddr( $_SERVER["REMOTE_ADDR"]);
    

    或者从 PHP 7 开始最简单:

    $r = $_SERVER['REMOTE_HOST'] ?? gethostbyaddr( $_SERVER["REMOTE_ADDR"]);
    

    这就是我喜欢 PHP 的原因!

    【讨论】:

      【解决方案4】:

      我在使用 PHPUnit 时遇到过这个问题。我是这样处理的:

        $_SERVER["REMOTE_ADDR"]     = array_key_exists( 'REMOTE_ADDR',      $_SERVER) ? $_SERVER['REMOTE_ADDR']     : '127.0.0.1'; 
        $_SERVER["REMOTE_HOST"]     = array_key_exists( 'REMOTE_HOST',      $_SERVER) ? $_SERVER['REMOTE_HOST']     : gethostbyaddr($_SERVER["REMOTE_ADDR"]);
        $_SERVER["SERVER_PROTOCOL"] = array_key_exists( 'SERVER_PROTOCOL',  $_SERVER) ? $_SERVER['SERVER_PROTOCOL'] : "HTTP/1.1";
        $_SERVER["REQUEST_METHOD"]  = array_key_exists( 'REQUEST_METHOD',   $_SERVER) ? $_SERVER['REQUEST_METHOD']  : "GET";
        $_SERVER["SERVER_PORT"]     = array_key_exists( 'SERVER_PORT',      $_SERVER) ? $_SERVER['SERVER_PORT']     : "80";
        $_SERVER["SERVER_SOFTWARE"] = array_key_exists( 'SERVER_SOFTWARE',  $_SERVER) ? $_SERVER['SERVER_SOFTWARE'] : "Apache";
        $_SERVER["HTTP_ACCEPT"]     = array_key_exists( 'HTTP_ACCEPT',      $_SERVER) ? $_SERVER['HTTP_ACCEPT']     : "text/html,application/xhtml+xml,application/xml,application/json";
        $_SERVER["HTTP_HOST"]       = array_key_exists( 'HTTP_HOST',        $_SERVER) ? $_SERVER['HTTP_HOST']       : "www.site.com";
        $_SERVER["HTTP_USER_AGENT"] = array_key_exists( 'HTTP_USER_AGENT',  $_SERVER) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36';
      

      【讨论】:

        【解决方案5】:

        在您的网络服务器中编辑 httpd.conf,在文件末尾添加这一行 HostnameLookups On,保存并重新启动您的服务器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-10
          • 2020-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多