PHP $_SERVER['SERVER_ADDR'] 变量总是返回 127.0.0.1

Posted

技术标签:

【中文标题】PHP $_SERVER[\'SERVER_ADDR\'] 变量总是返回 127.0.0.1【英文标题】:PHP $_SERVER[‘SERVER_ADDR’] variable always returns 127.0.0.1PHP $_SERVER['SERVER_ADDR'] 变量总是返回 127.0.0.1 【发布时间】:2011-03-13 06:50:55 【问题描述】:

我们有多个负载平衡的网络服务器机器运行相同的 php webapp (LAMP),我想在每台服务器上运行稍微不同的代码(出于测试目的)。我希望使用$_SERVER['SERVER_ADDR'] 超级全局来做这样的事情:

if ($_SERVER['SERVER_ADDR'] == 'XXX.XXX.XXX.XXX') 
  echo "Do one thing";
 elseif ($_SERVER['SERVER_ADDR'] == 'YYY.YYY.YYY.YYY') 
  echo "Do something else";

很遗憾,这不起作用,因为两台机器都将$_SERVER['SERVER_ADDR'] 设置为“127.0.0.1”。如何配置它们以便将$_SERVER['SERVER_ADDR'] 设置为它们的公共 IP 地址?

我猜这个问题可能与 /etc/hosts 有关,因此目前看起来像这样:

127.0.0.1       localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6
XXX.XX.XX.XX    blahblah

更新...

糟糕!我忽略了考虑 Web 服务器前面的 nginx 反向代理。由于 nginx conf 中的以下行,到这些 Web 服务器的所有流量都来自 nginx:

location / 
    root                  /var/www/staging/current;
    proxy_pass            http://localhost:8880;

【问题讨论】:

是通过localhost访问还是通过blahbl.ah访问? 当我公开访问该站点时会发生这种情况,即从负载均衡器的 IP 访问。 【参考方案1】:

使用这个更准确!

echo getHostByName($_SERVER[HTTP_HOST]);

【讨论】:

【参考方案2】:

您确实应该拥有加载的特定于服务器的配置和内部的服务器 ID。 每个系统的行为都会有所不同,并且会使用 ip 地址,主机名肯定很容易出错。通常服务器上有很多应用程序,从一天到另一天,它可能不再工作,您将很难调试(例如,some1 geths 设置反向条目的好主意,这样邮件就不会再收到垃圾邮件了? )

【讨论】:

【参考方案3】:

当然就这么简单

$ip = getHostByName(php_uname('n')); 
echo $ip;

【讨论】:

我不知道这些 PHP 函数 - 感谢您让我知道它们。 只是另一个容易受到相同错误影响的糟糕解决方案......例如在我的系统上,这正是代码输出 127.0.1.1【参考方案4】:

为了解决我的问题,我有 3 个想法:

    我可能会将每台服务器的 IP 地址硬编码到我们在每台服务器上的配置文件中的 PHP 变量中。 我可能会为 Apache 使用 反向代理添加转发模块 (mod_rpaf)。 我可能会将每台服务器上的proxy_pass 更改为XXX.XXX.XXX.XXX:8880YYY.YYY.YYY.YYY:8880 而不是localhost

【讨论】:

【参考方案5】:

这可能涉及更改负载平衡器连接到服务器的方式。我不知道这是什么软件。

根据机器之间变化的其他因素进行切换可能会更好。一个不错的选择是主机名:

$host= php_uname('n');
switch($host) 
    case 'webserver1':
        ...do one thing...
        break;
    case 'webserver2':
        ...do another thing...
        break;
    default:
        die('No configuration for unknown host '.$host);

【讨论】:

【参考方案6】:

/etc/hosts 中的反向行

XXX.XX.XX.XX    blahblah
127.0.0.1       localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6

应该有效

【讨论】:

我首先有127.0.0.1 条目,它工作正常...也许这与Apache 配置有关? 我尝试反转这些行(记得重新启动网络服务和 Apache) - 但不幸的是没有运气。

以上是关于PHP $_SERVER['SERVER_ADDR'] 变量总是返回 127.0.0.1的主要内容,如果未能解决你的问题,请参考以下文章

获取IP

PHP超全局变量

php 全局变量 预定义变量

PHP查看当前端口号

php常规笔试题

PHP:服务器变量列表