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

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

250237 次浏览

例如:

$_SERVER['SERVER_ADDR']

当您在 IIS 上时,请尝试:

$_SERVER['LOCAL_ADDR']

检查 $_ SERVER数组

echo $_SERVER['SERVER_ADDR'];

像这样:

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

像这样的服务器 ip:

$_SERVER['SERVER_ADDR'];

这个是港口的

$_SERVER['SERVER_PORT'];

前面的答案都给出 $_ SERVER [‘ SERVER _ ADDR’]。这在某些 IIS 安装上不起作用。如果您希望在 IIS 上使用这种方法,请使用以下命令:

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

如果您没有从上面的答案中获得任何信息,并且使用的是旧版本的 PHP,那么您可能必须使用 $HTTP_SERVER_VARS['server_ADDR']

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

在 Windows 7上运行 XAMPP v1.7.1运行 Apache HTTP Server。 不幸的是,它只给了我的网关 IP 地址。

检查 $_ SERVER 数组

echo $_SERVER['SERVER_ADDR'];

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

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

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

当您正在运行一个独立的脚本,而不是通过 Web 服务器运行时,这种方法可以很好地工作。

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

$server_name=exec('hostname');

因为没有设置 $_SERVER[] SERVER_ADDRHTTP_HOSTSERVER_NAME

这两个被投票最多的答案都不会可靠地返回服务器的公共地址。一般来说,$_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一样,它可能比较慢。老实说,我不确定哪种方法最常用,但是要牢记的是,特定的场景/配置会导致所有这些方法的输出都不正确... ... 所以如果可能的话,请验证您正在使用的方法返回的是您所期望的值。

我来到这个页面寻找获得自己的 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 和 OSX 上获得本地机器的主 IP 地址?)

这就是您可以用来作为上述示例的改编,而不用担心服务器上安装的 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);
?>

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

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

你可以使用 https://icanhazip.com,由于 这个项目属于 Cloudflare有时可以更可靠。

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

为了准确地获得外部 IP 地址,你可以调用亚马逊提供的服务 checkip.amazonaws.com。

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

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

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