【问题标题】:How to identify server IP address in PHP如何在 PHP 中识别服务器 IP 地址
【发布时间】:2011-08-13 15:25:36
【问题描述】:

如何在 PHP 中识别服务器 IP 地址?

【问题讨论】:

  • 你是指请求IP地址还是运行你应用的机器IP?

标签: php ip


【解决方案1】:

服务器ip如下:

$_SERVER['SERVER_ADDR'];

这个用于港口

$_SERVER['SERVER_PORT'];

【讨论】:

  • 没有。在某些共享主机上,这会返回 ::1
  • 这可能不正确,具体取决于您的 Web 服务器前面使用的负载均衡器。在这种情况下,您还需要 X-Forwarded-For 标头:en.wikipedia.org/wiki/X-Forwarded-For
  • 这不是服务器地址!这是remote 浏览器调用服务器的地址,它在远程用户的控制之下。请改用John K 的答案
  • 这不给服务器ip。出于某种原因,它给了我的本地 ip
  • 它也没有给出 php-fpm 服务器地址,而是用于关联的 Web 服务器(nginx、apache)。所以它对于 mysql-client 主机规范 (user@host) 是不正确的。
【解决方案2】:

如果您使用的是 PHP 5.3 或更高版本,您可以执行以下操作:

$host= gethostname();
$ip = gethostbyname($host);

当您运行独立脚本而不是通过网络服务器运行时,这很有效。

【讨论】:

  • 完美,我正在寻找。谢谢约翰
  • +1 这是唯一适用于命令行的解决方案。
  • @andreas 不应该。本地主机名应该在/etc/hosts 文件中,并且会很快——尽管它可能只是127.0.0.1。如果它确实必须调用 DNS,那么它会像你说的那样很慢。
  • +1 但只是一个问题.. 我在本地服务器上使用 xampp 尝试它,它返回 ip 192.168etc 但是.. 它应该是 127.0.0.1 不??
  • 这对我有用,但有些机器显示域名。如何纠正这个问题。
【解决方案3】:

例如:

$_SERVER['SERVER_ADDR']

当您使用 IIS 时,请尝试:

$_SERVER['LOCAL_ADDR']

【讨论】:

  • $_SERVER['LOCAL_ADDR'] 仅在 PHP 作为 CGI 模块运行时在 IIS 下可用。
  • @rudi_visser 它也适用于 fastcgi,但是如果你通过 locahost 连接,你会得到 ::1 。如果您通过服务器的名称或 ip 连接,您将获得真实的 ip。
  • @starbeamrainbowlabs FastCGI is CGI :) 我的意思是与作为 ISAPI 模块运行相反,这是在 FastCGI 作为稳定平台主要出现之前编写的。
  • @starbeamrainbowlabs 任何看起来像 ::1 的东西都可能是 IP6 地址
  • @TobyAllen 谢谢:)。奇怪的是我的网络不支持 ipv6,但我的服务器(Windows 7 机器)将其 IP 报告为 ::1,即 ipv6 环回地址。
【解决方案4】:

我来到这个页面是为了寻找一种方法来获取我自己的 IP 地址,而不是连接到我的远程机器。

这不适用于 Windows 机器。

但万一有人搜索我要找的东西:

#! /usr/bin/php
<?php
$my_current_ip=exec("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'");
echo $my_current_ip;

(无耻改编自How to I get the primary IP address of the local machine on Linux and OS X?

【讨论】:

  • 这是从 shell 运行 PHP 脚本时唯一有效的选项。问题:当有多个活动接口时,这如何决定返回哪个地址?我测试了有线和无线以太网连接处于活动状态,然后只有无线处于活动状态,它两次都返回 wlan ip。好的剧本,谢谢!
  • 它实际上并不知道返回哪一个。它只是从 ifconfig 的输出中返回最后一个 inet 接口,但忽略 127.0.0.1。如果您只有“通常”的界面,那么它的工作就很不错了。如果您指定所需的接口“ifconfig wlan0 | ...”,这可能是最安全的。这个脚本绝不是完美的,但它可以在简单的设置下工作,并且它展示了原则上如何做到这一点,并根据需要进行调整。
  • ifconfig | grep 'inet 地址' |剪切 -d ':' -f 2 | awk '{ 打印 $1 }' | grep -vE '^(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|127\. )' 是我对此的最新版本。它过滤掉所有本地 ip,只给你外部的
  • 我有多个网络接口所以我做了ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | grep -e '192\.168\.1\.'
【解决方案5】:

投票最多的答案都不会可靠地返回服务器的公共地址。通常$_SERVER['SERVER_ADDR'] 是正确的,但是如果您通过 VPN 访问服务器,它可能会返回内部网络地址而不是公共地址,即使不在同一个网络上,某些配置也将只是空白或有其他一些指定的值。

同样,$host= gethostname(); $ip = gethostbyname($host); 在某些情况下不会返回正确的值,因为它依赖 DNS(内部配置或外部记录)和服务器的主机名设置来推断服务器的 IP 地址。这两个步骤都有潜在的错误。例如,如果服务器的主机名被格式化为域名(即HOSTNAME=yahoo.com),那么(至少在我的 php5.4/Centos6 设置中)gethostbyname 将直接跳到查找 Yahoo.com 的地址而不是本地地址服务器的。

此外,由于 gethostbyname 依赖公共 DNS 记录,因此测试服务器的公共 DNS 记录未发布或不正确(例如,您通过 localhost 或 IP 地址访问服务器,或者如果您覆盖公共DNS 使用您的本地 hosts 文件),那么您将无法返回任何 IP 地址(它只会返回主机名),或者更糟糕的是,如果公共 DNS 记录中存在或如果有通配符,它​​将返回错误的地址域。

根据情况,您还可以尝试第三种方法,如下所示:

$external_ip = exec('curl http://ipecho.net/plain; echo');

这有其自身的缺陷(依赖于特定的第三方站点,并且可能存在通过不同主机或代理路由出站连接的网络设置),就像gethostbyname 它可能会很慢。老实说,我不确定哪种方法最经常是正确的,但要牢记的教训是,特定的场景/配置将导致所有这些方法的输出不正确......所以如果可能的话,请验证你使用的方法using 正在返回您期望的值。

【讨论】:

    【解决方案6】:

    这是您可以用作上述示例的改编版,而无需担心在您的服务器上安装 curl。

    <?php
          // create a new cURL resource
          $ch = curl_init ();
    
          // set URL and other appropriate options
          curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain");
          curl_setopt ($ch, CURLOPT_HEADER, 0);
          curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
    
          // grab URL and pass it to the browser
    
          $ip = curl_exec ($ch);
          echo "The public ip for this server is: $ip";
          // close cURL resource, and free up system resources
          curl_close ($ch);
        ?>
    

    【讨论】:

      【解决方案7】:

      检查$_SERVER 数组

      echo $_SERVER['SERVER_ADDR'];
      

      【讨论】:

        【解决方案8】:

        前面的答案都给出了$_SERVER['SERVER_ADDR']。这不适用于某些 IIS 安装。如果您希望它在 IIS 上工作,请使用以下命令:

        $server_ip = gethostbyname($_SERVER['SERVER_NAME']);
        

        【讨论】:

        • 真的有效!使用 $_SERVER["SERVER_ADDR"] 我得到 127.0.0.1
        【解决方案9】:

        如果你在 bash shell 中使用 PHP,你可以使用:

        $server_name=exec('hostname');
        

        因为$_SERVER[] SERVER_ADDRHTTP_HOSTSERVER_NAME 未设置。

        【讨论】:

          【解决方案10】:

          我发现这对我有用: GetHostByName("");

          在运行 Apache 网络服务器的 Windows 7 上运行 XAMPP v1.7.1。 不幸的是,它只提供了我的网关 IP 地址。

          【讨论】:

            【解决方案11】:

            我刚刚创建了一个简单的脚本,它将在 IIS 中返回 $_SERVER['REMOTE_ADDR'] 和 $_SERVER['SERVER_ADDR'],因此您不必更改每个变量。只需将此文本粘贴到包含在每个页面中的 php 文件中即可。

            /** IIS IP Check **/
            if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
            if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
            

            【讨论】:

              【解决方案12】:
              $serverIP = $_SERVER["SERVER_ADDR"];
              echo "Server IP is: <b>{$serverIP}</b>";
              

              【讨论】:

                【解决方案13】:

                如果您没有从上述答案中得到任何结果并且您使用的是旧版本的 PHP,您可能必须使用 $HTTP_SERVER_VARS['server_ADDR']

                【讨论】:

                  【解决方案14】:

                  检查 $_SERVER 数组

                  echo $_SERVER['SERVER_ADDR'];
                  

                  【讨论】:

                  • 它找不到“真实 IP”,它找到任何人都可以设置的任意、未经验证的 HTTP 标头,如果您愿意,任何人都可以用来欺骗他们的 IP。 i> 如果客户端在代理后面,那就这样吧,不要信任任何 HTTP 标头。这也根本不适合这个问题。
                  • 无法弄清楚这个答案根本不适合这个问题。问题是:“如何在 PHP 中识别服务器 IP 地址?”。 OP应该学习如何更好地提问,或者您应该学习如何阅读问题。此外,如果客户端在代理后面,无论您从服务器端尝试什么,您仍然会被搞砸。完全不同的情况是服务器位于代理后面,因为您可以检查 X-FORWARDED-FOR 标头。
                  • @deceze $_SERVER["SERVER_ADDR"] 与 HTTP 标头没有任何关系。这是由服务器软件填充的,$_SERVER 中所有与 HTTP 相关的东西都以 HTTP_ 为前缀。 php.net/manual/en/reserved.variables.server.php
                  • @poncha 我的评论与这篇文章的original revision有关。
                  【解决方案15】:

                  当站点在负载均衡器、反向代理服务器或 CloudFront 等 CDN 之后运行时,这是一种解决方案:

                  $conn = curl_init();
                  curl_setopt($conn, CURLOPT_URL, 'any.valid.url');
                  curl_exec($conn);
                  $WebServerIP = curl_getinfo($conn)['local_ip'];
                  

                  【讨论】:

                    【解决方案16】:

                    您可以使用https://icanhazip.com,因为Cloudflare owned this project 有时它会更加可靠。

                    $my_real_ip = file_get_contents('https://icanhazip.com/');
                    

                    【讨论】:

                      【解决方案17】:

                      像这样:

                      $_SERVER['SERVER_ADDR'];
                      

                      【讨论】:

                        猜你喜欢
                        • 2018-10-20
                        • 2011-05-24
                        • 2019-05-10
                        • 2010-11-25
                        • 2010-12-21
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-09-11
                        相关资源
                        最近更新 更多