前端控制器index.php
has by default:
// The check is to ensure we don't use .env in production
if (!isset($_SERVER['APP_ENV'])) {
(new Dotenv())->load(__DIR__.'/../.env');
}
这背后的原因是什么?为什么在生产环境中应忽略.env
文件?
答案 0 :(得分:5)
.env
背后的想法是它应该主要用于development and testing environments,因为在其他环境(如生产或登台Web服务器)中,您应该能够在外部设置这些变量。例如,Nginx allows you在配置文件中使用env
指令来设置应用程序能够获取的变量。
我认为Symfony选择以这种方式处理.env
的原因是它允许您统一开发人员可能拥有的任何运行时环境的变量的方式。还要记住,在生产部署中,环境变量是一流的,非常常见,并且不会经常发生变化。
其他方面是安全性:服务器配置应该比Symfony应用程序的源代码更安全。例如。作为对您的prod服务器上的应用程序根目录具有文件系统访问权限的人,如果数据库凭据仅存储在.env
中,则可以窃取数据库凭据,但如果将数据库凭据安全地保存在某个位置,您将无法访问这些凭据在服务器配置中,在应用程序根目录之外。
无论如何,如果您准备承担将生产计算机上的配置暴露给有权访问.env
的所有人的风险,您仍然可以在您的分期中启用.env
或生产环境。为此,您应该在index.php
中删除或注释掉这些行:
// Comment out the if statement so the code gets run every time:
// if (!isset($_SERVER['APP_ENV'])) {
(new Dotenv())->load(__DIR__.'/../.env');
// }
此外,您必须将DotEnv
依赖项从require-dev
deps移至require
中的composer.json
部分:
{
"type": "project",
"license": "proprietary",
"require": {
...
"symfony/dotenv": "^4.0",
...
}