2011-04-27 57 views

回答

139

喜欢本作的服务器IP:

$_SERVER['SERVER_ADDR']; 

,这为港口

$_SERVER['SERVER_PORT']; 
+8

否。在某些共享主机上返回:: 1 – TheRealChx101 2014-08-02 06:18:00

+1

这可能不正确,这取决于Web服务器前面使用的负载平衡器。在这种情况下,您还需要X-Forwarded-For标头:http://en.wikipedia.org/wiki/X-Forwarded-For – Ligemer 2014-08-25 23:04:17

+17

这不是服务器地址!这是* remote *浏览器调用远程用户控制的服务器的地址。使用由'约翰K'的答案而不是 – Ariel 2015-02-12 10:36:26

19

例如:

$_SERVER['SERVER_ADDR'] 

当你在IIS上,尝试:

$_SERVER['LOCAL_ADDR'] 
+1

当PHP作为CGI模块运行时,$ _SERVER ['LOCAL_ADDR']'仅在IIS下可用。 – 2011-04-27 07:58:07

+0

@rudi_visser它也适用于fastcgi,但是如果通过locahost连接,则返回:: 1返回。如果通过服务器的名称或IP连接,则会返回真实的IP。 – starbeamrainbowlabs 2012-07-21 14:01:49

+0

@starbeamrainbowlabs FastCGI *是* CGI :)我的意思是与作为ISAPI模块运行形成鲜明对比,这是在FastCGI作为稳定平台出现之前编写的。 – 2012-07-21 17:54:49

5

检查$_SERVER阵列

echo $_SERVER['SERVER_ADDR']; 
-1

像这样:

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

以前的答案都给予$ _ SERVER [ 'SERVER_ADDR']。这在一些IIS安装上不起作用。如果你想这在IIS上工作,那么使用以下命令:

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

您可能需要使用$HTTP_SERVER_VARS['server_ADDR'],如果你没有得到上面的答案什么,如果你正在使用PHP

的旧版本
1

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

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

-1

检查$ _ SERVER数组

echo $_SERVER['SERVER_ADDR']; 
+1

这并没有找到“真正的IP”,它发现任何人可能设置的***任意,未经验证的HTTP头,任何人都可能用它来欺骗他们的IP,如果你喜欢他们。如果客户端位于代理服务器后面,那么不要相信任何HTTP头文件。这也不符合这个问题。 – deceze 2013-04-03 10:15:04

+1

无法确定这个答案如何不符合问题。问题是:“我如何识别PHP中的服务器IP地址?”。 OP应该学会如何更好地提问,或者你应该学习如何阅读问题。此外,如果客户端位于代理服务器后面,无论您尝试从服务器端进行尝试,仍然会受到干扰。完全不同的情况是服务器位于代理之后,因为您可以使用X-FORWARDED-FOR标头进行检查。 – 2014-05-20 15:14:20

2

我刚刚创建一个简单的脚本,将带回$ _ 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']; } 
64

如果您使用的PHP版本5.3或更高版本,你可以做到以下几点:

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

这种运作良好,当你正在运行一个独立的脚本,通过Web服务器没有运行。

+5

这是一个好主意,但性能可能是gethostbyname()的问题... – andreas 2013-07-04 13:33:06

+0

完美,我在找什么。谢谢John – Frank 2014-01-07 13:28:08

+4

+1这是唯一可以与命令行配合使用的解决方案。 – 2014-11-09 01:52:52

4

如果使用在bash PHP壳,您可以使用:

$server_name=exec('hostname'); 

因为$_SERVER[] SERVER_ADDRHTTP_HOSTSERVER_NAME未设置。

10

最新的投票答案都不会可靠地返回服务器的公共地址。通常$_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那样可能会很慢。我真的不确定哪种方法最经常是正确的,但要记住的一点是,特定的场景/配置会导致所有这些方法的错误输出......因此,如果可能的话,请验证您的方法使用正在返回您期望的值。

2

我来到这个页面寻找一种让我自己的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?无耻改编)

+0

这是从shell运行PHP脚本时实际工作的唯一选项。问题:当有多个活动接口时,如何决定返回哪个地址?我测试了有线和无线以太网连接处于活动状态,然后仅使用无线活动,并且两次都返回wlan ip。好剧本,谢谢! – 2017-05-20 18:18:37

+0

它实际上并不知道要返回哪一个。它只是从ifconfig的输出中返回最后一个inet接口,但忽略127.0.0.1。如果你只有“常用”接口,那么它的表现相当不错。如果你指定你想要的接口“ifconfig wlan0 | ...”,这可能是最安全的。这个脚本绝不是完美的,但它可以在简单的设置中工作,它演示了如何在原则上做到这一点,以便根据需要进行调整。 – Dominic 2017-05-24 07:36:34

+0

ifconfig | grep'inet addr'| cut -d':'-f 2 | awk'{print $ 1}'| grep -vE'^(192 \ .168 | 10 \。| 172 \ .1 [6789] \。| 172 \ .2 [0-9] \。| 172 \ .3 [01] \。| 127 \。 )'是我对此的最新修订。它过滤掉所有本地ips,只给你外部 – Dominic 2017-11-14 13:20:46

3

这是你可以为上面的例子适应用什么,而不必担心卷曲安装在你的服务器上。

<?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); 
    ?>