我们使用以下函数自动检测我们是在机器内部还是在实时服务器上,然后为各种组件选择适当的配置:
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,那么该功能将被欺骗。
还有其他方法来欺骗这个功能吗?还有哪些其他变量/地方可以用来确定我们的位置?
答案 0 :(得分:15)
在Apache虚拟主机配置中设置环境变量。这就是Zend Framework的做法。
有关示例,请参阅ZF quick start guide(“创建虚拟主机”部分。)
在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
}
答案 1 :(得分:11)
'127.0.0.1' == $_SERVER["REMOTE_ADDR"]
这永远不会在您的实时系统上评估为TRUE
。 :)
答案 2 :(得分:3)
添加到Andy Shellam's answer ..
如果您正在使用mod_vhost_alias,或者具有相同(虚拟)文档根目录的各种域,则可以根据参数设置变量,例如
SetEnvIf SERVER_ADDR x.x.x.x APPLICATION_ENV=development
SetEnvIf HTTP_HOST abc.example.com APPLICATION_ENV=development
答案 3 :(得分:1)
创建并稍后查找仅存在于实时服务器文件系统上的文件。
当然,您的环境应该尽可能相似;我建议的是这样的:在目录/ var / environment /中,有一个名为{devel | test | qa | staging | live}的文件,具体取决于您所在的服务器 - 然后只需检查文件名。 / p>
当然,您需要从版本控制和您可能拥有的任何构建过程中排除此文件。
答案 4 :(得分:0)
当然,如果您在本地使用虚拟主机,例如example.com,那么该功能将被欺骗。
此外,如果主机不是本地主机但使用widlcard或默认vhost defn,并且用户在本地将IP地址添加到hosts文件。
我建议在include路径上有一个目录,该路径也存在于实时但不会在那里复制 - 只需存储:
function getEnv(){
return 'Live';
}
或
function getEnv(){
return 'Test';
}
如果两个env都在同一台服务器上 - 您仍然可以通过在Apache config或.htaccess中设置include_path来实现此目的。
这也允许您分离潜在敏感的env特定数据 - 如数据库主机/密码和加密密钥。
下进行。