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

问题描述 投票:0回答:18

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

php ip
18个回答
201
投票

服务器IP如下:

$_SERVER['SERVER_ADDR'];

这个是港口的

$_SERVER['SERVER_PORT'];

125
投票

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

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

当您运行独立脚本而不是通过 Web 服务器运行时,这非常有效。


21
投票

例如:

$_SERVER['SERVER_ADDR']

当您在 IIS 上时,请尝试:

$_SERVER['LOCAL_ADDR']

15
投票

投票最多的答案都不会可靠地返回服务器的公共地址。一般来说

$_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 记录或者存在通配符,它将返回公共 DNS 记录中指定的错误地址域名。

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

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

这有其自身的缺陷(依赖于特定的第三方站点,并且可能存在通过不同主机或代理路由出站连接的网络设置),并且像

gethostbyname
一样,它可能会很慢。老实说,我不确定哪种方法最常见,但要记住的教训是,特定的场景/配置将导致所有这些方法的输出不正确......因此,如果可能的话,请验证您所使用的方法using 返回您期望的值。


15
投票

我来到此页面寻找一种获取我自己的 IP 地址的方法,而不是连接到我的远程计算机的 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;

(无耻改编自如何在Linux和OS X上获取本地机器的主IP地址?


13
投票

您可以将其用作上述示例的改编版本,而不必担心服务器上安装的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);
    ?>

6
投票

检查$_SERVER数组

echo $_SERVER['SERVER_ADDR'];

6
投票

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

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

5
投票

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

$server_name=exec('hostname');

因为

$_SERVER[] SERVER_ADDR
HTTP_HOST
SERVER_NAME
未设置。


2
投票

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

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


2
投票

我刚刚创建了一个简单的脚本,它将在 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']; }

2
投票

要在可信环境中准确获取外部IP地址,您可以调用亚马逊提供的服务checkip.amazonaws.com。

$ip = exec("curl https://checkip.amazonaws.com");

正如我们所见,这是一个非常普遍的问题,以至于 AWS 创造了这个工具供全世界使用。

我会使用它而不是其他类似的服务,因为它是由 AWS 提供的,并且可能会存在很长时间。

补充

对于专业用途,我建议使用上面亚马逊的 checkip。但要在终端进行快速而肮脏的检查,您可以使用 https://ip.me,这是第三方服务,到目前为止对我来说效果很好:

curl ip.me

如果他们检测到这是一个 cli 工具连接,它只会返回没有 HTML 标记的 IP。


1
投票
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";

1
投票

如果您没有从上面的答案中得到任何信息并且您使用的是旧版本的 PHP,您可能必须使用

$HTTP_SERVER_VARS['server_ADDR']


1
投票
您可以使用

https://icanhazip.com 并且由于 Cloudflare 拥有这个项目有时它甚至可以更可靠。

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

0
投票
像这样:

$_SERVER['SERVER_ADDR'];
    

0
投票
检查 $_SERVER 数组

echo $_SERVER['SERVER_ADDR'];
    

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

$conn = curl_init(); curl_setopt($conn, CURLOPT_URL, 'any.valid.url'); curl_exec($conn); $WebServerIP = curl_getinfo($conn)['local_ip'];
    
© www.soinside.com 2019 - 2024. All rights reserved.