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


How to identify server IP address in PHP

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

服务器ip:

$_SERVER['SERVER_ADDR'];

和这个端口

$_SERVER['SERVER_PORT'];

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

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

当你运行一个独立的脚本,而不是通过web服务器运行时,这个效果很好。

例如:

$_SERVER['SERVER_ADDR']

如果你在IIS上,试试:

$_SERVER['LOCAL_ADDR']

投票最多的答案都不能可靠地返回服务器的公共地址。一般来说,$_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地址,或者你使用本地hosts文件覆盖公共DNS)然后你会回来要么没有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和OS X上获得本地机器的主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);
    ?>

查看$_SERVER数组

echo $_SERVER['SERVER_ADDR'];

前面的答案都给出$_SERVER['SERVER_ADDR']。这在某些IIS安装中不起作用。如果您想让它在IIS上工作,那么使用以下命令:

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

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

$server_name=exec('hostname');

因为没有设置$_SERVER[] SERVER_ADDRHTTP_HOSTSERVER_NAME

我发现这个对我有用:

GetHostByName (" ");

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

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

/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";

如果你没有从上面的答案中得到任何东西,如果你使用的是旧版本的PHP

你可能不得不使用$HTTP_SERVER_VARS['server_ADDR']

你可以使用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提供的,并且可能会存在很长时间。

查看$_SERVER数组

echo $_SERVER['SERVER_ADDR'];

当站点运行在负载均衡器、反向代理服务器或CDN(如CloudFront)后面时,有一个解决方案:

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

像这样:

$_SERVER['SERVER_ADDR'];