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

poo*_*oja 113 php ip

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

Clo*_*ble 170

像这样服务器ip:

$_SERVER['SERVER_ADDR'];
Run Code Online (Sandbox Code Playgroud)

这对于港口

$_SERVER['SERVER_PORT'];
Run Code Online (Sandbox Code Playgroud)

  • 这不是服务器地址!这是*remote*浏览器调用服务器的地址,该服务器受远程用户的控制.请使用"John K"的答案 (29认同)
  • 在某些共享主机上,这会返回:: 1 (8认同)
  • 这可能不正确,具体取决于Web服务器前面使用的Load Balancer.在这种情况下,您还需要X-Forwarded-For标头:http://en.wikipedia.org/wiki/X-Forwarded-For (3认同)

小智 98

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

$host= gethostname();
$ip = gethostbyname($host);
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个好主意,但性能可能是gethostbyname()的问题...... (6认同)
  • +1这是唯一可以使用命令行的解决方案. (5认同)
  • @andreas不应该。本地主机名应该在`/ etc / hosts`文件中,并且应该是快速的-尽管它可能只是`127.0.0.1`。如果确实必须调用DNS,那么它将像您所说的那样慢。 (2认同)

Fla*_*ask 19

例如:

$_SERVER['SERVER_ADDR']
Run Code Online (Sandbox Code Playgroud)

当你在IIS上,尝试:

$_SERVER['LOCAL_ADDR']
Run Code Online (Sandbox Code Playgroud)

  • `$ _SERVER ['LOCAL_ADDR']`仅在PHP作为CGI模块运行时才在IIS下可用. (2认同)

Dom*_*Dom 13

我来到这个页面寻找一种获取我自己的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;
Run Code Online (Sandbox Code Playgroud)

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

  • 如果配置 | grep 'inet 地址' | cut -d ':' -f 2 | awk '{ 打印 $1 }' | grep -vE '^(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|127\. )' 是我对此的最新修订。它过滤掉所有本地ips,只给你外部 (2认同)

Ben*_*n D 10

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

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

此外,由于gethostbyname回退到公共DNS记录,测试服务器具有未发布或不正确的公共DNS记录(例如,您通过localhostIP地址访问服务器,或者如果您使用本地hosts文件覆盖公共DNS ),那么您'将返回没有IP地址(它只会返回主机名)或更糟糕的是它将返回公共DNS记录中指定的错误地址(如果存在或者域名是否存在通配符).

根据具体情况,您还可以通过以下方式尝试第三种方法:

$external_ip = exec('curl http://ipecho.net/plain; echo');
Run Code Online (Sandbox Code Playgroud)

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


Emm*_*uni 9

这可以用作上述示例的改编,而不必担心服务器上安装的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);
    ?>
Run Code Online (Sandbox Code Playgroud)


小智 5

检查$ _SERVER数组

echo $_SERVER['SERVER_ADDR'];
Run Code Online (Sandbox Code Playgroud)


qbe*_*220 5

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

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
Run Code Online (Sandbox Code Playgroud)


小智 5

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

$server_name=exec('hostname');
Run Code Online (Sandbox Code Playgroud)

因为$_SERVER[] SERVER_ADDR,HTTP_HOSTSERVER_NAME没有设定.