【发布时间】:2011-08-13 15:25:36
【问题描述】:
如何在 PHP 中识别服务器 IP 地址?
【问题讨论】:
-
你是指请求IP地址还是运行你应用的机器IP?
如何在 PHP 中识别服务器 IP 地址?
【问题讨论】:
服务器ip如下:
$_SERVER['SERVER_ADDR'];
这个用于港口
$_SERVER['SERVER_PORT'];
【讨论】:
John K 的答案
如果您使用的是 PHP 5.3 或更高版本,您可以执行以下操作:
$host= gethostname();
$ip = gethostbyname($host);
当您运行独立脚本而不是通过网络服务器运行时,这很有效。
【讨论】:
/etc/hosts 文件中,并且会很快——尽管它可能只是127.0.0.1。如果它确实必须调用 DNS,那么它会像你说的那样很慢。
例如:
$_SERVER['SERVER_ADDR']
当您使用 IIS 时,请尝试:
$_SERVER['LOCAL_ADDR']
【讨论】:
$_SERVER['LOCAL_ADDR'] 仅在 PHP 作为 CGI 模块运行时在 IIS 下可用。
我来到这个页面是为了寻找一种方法来获取我自己的 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?)
【讨论】:
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\.'
投票最多的答案都不会可靠地返回服务器的公共地址。通常$_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 正在返回您期望的值。
【讨论】:
这是您可以用作上述示例的改编版,而无需担心在您的服务器上安装 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_ADDR、HTTP_HOST 和SERVER_NAME 未设置。
【讨论】:
我发现这对我有用: GetHostByName("");
在运行 Apache 网络服务器的 Windows 7 上运行 XAMPP v1.7.1。 不幸的是,它只提供了我的网关 IP 地址。
【讨论】:
我刚刚创建了一个简单的脚本,它将在 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']; }
【讨论】:
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";
【讨论】:
如果您没有从上述答案中得到任何结果并且您使用的是旧版本的 PHP,您可能必须使用 $HTTP_SERVER_VARS['server_ADDR']
【讨论】:
检查 $_SERVER 数组
echo $_SERVER['SERVER_ADDR'];
【讨论】:
$_SERVER["SERVER_ADDR"] 与 HTTP 标头没有任何关系。这是由服务器软件填充的,$_SERVER 中所有与 HTTP 相关的东西都以 HTTP_ 为前缀。 php.net/manual/en/reserved.variables.server.php
当站点在负载均衡器、反向代理服务器或 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 owned this project 有时它会更加可靠。
$my_real_ip = file_get_contents('https://icanhazip.com/');
【讨论】:
像这样:
$_SERVER['SERVER_ADDR'];
【讨论】: