Answers:
像这样的服务器IP:
$_SERVER['SERVER_ADDR'];
这是港口
$_SERVER['SERVER_PORT'];
John K
,而不是
如果您使用的是PHP 5.3或更高版本,则可以执行以下操作:
$host= gethostname();
$ip = gethostbyname($host);
当您运行独立脚本而不通过Web服务器运行时,此方法效果很好。
/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;
(从如何在Linux和OS X上获取本地计算机的主IP地址进行了无耻的修改)
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地址访问服务器,或者如果您使用本地hosts
文件覆盖公共DNS ),则您如果没有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);
?>
如果您在bash shell中使用PHP,则可以使用:
$server_name=exec('hostname');
因为$_SERVER[] SERVER_ADDR
,HTTP_HOST
并且SERVER_NAME
未设置。
我发现这对我有用:GetHostByName(“”);
在运行Apache Web服务器的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']; }
检查$ _SERVER数组
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
与HTTP标头没有任何关系。这是由服务器软件填充的,$ _SERVER中所有与HTTP相关的内容都以HTTP_为前缀。php.net/manual/en/reserved.variables.server.php