在Yii2中使用$ _SERVER ['SERVER_NAME']检测环境是否正确

时间:2018-06-12 04:53:09

标签: php yii2

if ($_SERVER['SERVER_NAME'] == 'localhost' || $_SERVER['SERVER_NAME'] == '127.0.0.1') 
{
    defined('YII_DEBUG') or define('YII_DEBUG', true);
    defined('YII_ENV') or define('YII_ENV', 'dev');
}

require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../../vendor/yiisoft/yii2/Yii.php';
require __DIR__ . '/../../common/config/bootstrap.php';
require __DIR__ . '/../config/bootstrap.php';

if(YII_ENV == 'prod')
{
    $config = yii\helpers\ArrayHelper::merge(
        require __DIR__ . '/../../common/config/main.php',
        require __DIR__ . '/../config/main.php'
    );
}
else
{
    $config = yii\helpers\ArrayHelper::merge(
       require __DIR__ . '/../../common/config/main.php',
       require __DIR__ . '/../../common/config/main-local.php',
       require __DIR__ . '/../config/main.php',
       require __DIR__ . '/../config/main-local.php'
   );
}

我正在尝试使用多个环境,但不要在文件中随时更改,因此我使用if index.php文件中的条件及其工作但我不知道这是正确的方法还是不。

1 个答案:

答案 0 :(得分:1)

不,不是。这是一个潜在的安全问题 - $_SERVER['SERVER_NAME']可能会被欺骗,因此有人可能会使用localhost作为主机名访问您的远程生产服务器。如果您未在网络服务器级别验证主机名,那么他将在调试模式下看到您的网站。来自$_SERVER['SERVER_NAME'] docs:

  

注意:在Apache 2下,您必须设置UseCanonicalName = On和ServerName。否则,此值反映客户端提供的主机名,这可能是欺骗性的。在依赖于安全性的上下文中依赖此值是不安全的。

您应该将特定于环境的设置/常量保留在版本控制之外的单独文件中。例如在config/environment-local.php中。并在每个实例上手动设置它。 您也可以使用Composer挂钩来复制此文件的默认内容 - 我在my template中实现了类似的内容。然后,请将此文件放在index.php文件的顶部,而不是您的条件:

require __DIR__ . '/../config/environmen-local.php';

require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../../vendor/yiisoft/yii2/Yii.php';
require __DIR__ . '/../../common/config/bootstrap.php';
require __DIR__ . '/../config/bootstrap.php';

// rest of bootstrap