9

我们使用以下功能自动检测我们是在内部机器上还是在实时服务器上,然后为各种组件选择适当的配置:

function devIsLocal(){

    $res=false;

    $http_host=$_SERVER['HTTP_HOST'];

    if($http_host=='localhost')$res=true;
    if($http_host=='127.0.0.1')$res=true;
    if(substr($http_host,-4)=='.lan')$res=true;
    if(strpos($http_host, '.')===false)$res=true;

    return($res);

}

如您所见,它仅依赖于 HTTP_HOST 值。

当然,如果您在本地使用某种虚拟主机,例如 example.com,那么该功能将被欺骗。

还有其他方法可以欺骗该功能吗?以及我们可以查看哪些其他变量/位置来确定我们在哪里?

4

5 回答 5

16

在 Apache 虚拟主机配置中设置环境变量。Zend 框架就是这样做的。

有关示例,请参见ZF 快速入门指南(“创建虚拟主机”部分。)

在您的 httpd.conf 或 .htaccess 文件中,输入:

SetEnv APPLICATION_ENV "development"

然后在您的应用程序中,使用getenv函数获取值:

$environment = getenv("APPLICATION_ENV");
if ($environment == "development")
{
    // do development stuff
}
else if ($environment == "live")
{
    // do live stuff
}
于 2010-04-09T12:06:20.657 回答
12
'127.0.0.1' == $_SERVER["REMOTE_ADDR"]

这永远不会TRUE在您的实时系统上进行评估。:)

于 2010-04-09T12:11:58.010 回答
3

添加到安迪·谢勒姆的答案..

如果您正在使用 mod_vhost_alias,或者有不同的域具有相同的(虚拟)文档根目录,您可以根据参数设置变量,例如

SetEnvIf SERVER_ADDR x.x.x.x APPLICATION_ENV=development
SetEnvIf HTTP_HOST abc.example.com APPLICATION_ENV=development
于 2010-04-09T12:33:28.430 回答
1

创建并稍后查找仅存在于实时服务器文件系统上的文件。

当然,您的环境应该尽可能相似;我的建议是这样的:在目录 /var/environment/ 中,有一个名为 {devel|test|qa|staging|live} 的文件,具体取决于您所在的服务器 - 然后只需检查文件名。

当然,您需要将此文件从版本控制和您可能拥有的任何构建过程中排除。

于 2010-04-09T11:58:55.913 回答
0

当然,如果你在本地使用了 example.com 之类的虚拟主机,那么该功能就会被欺骗。

此外,如果主机不是本地主机但使用通配符或默认 vhost defn 并且用户将 IP 地址添加到本地主机文件。

我建议在包含路径上有一个目录,该目录也存在于 live 中,但不在那里复制 - 并简单地存储:

function getEnv(){
  return 'Live';
}

或者

function getEnv(){
  return 'Test';
}

如果两个环境都在同一台服务器上 - 您仍然可以通过在 Apache config 或 .htaccess 中设置 include_path 来做到这一点。

这还允许您分离潜在敏感的环境特定数据 - 例如数据库主机/密码和加密密钥。

C。

于 2010-04-09T11:59:45.507 回答