nit*_*wit 10 php apache cgi environment-variables
我试图将.htaccess中的环境变量传递给PHP.这在我的本地WAMP服务器上运行得很好,但在托管我的网站的服务器上,它无故失败.
这是我的测试配置:
的.htaccess:
SetEnv TEST_VARIABLE test_value
Run Code Online (Sandbox Code Playgroud)
test.php的:
<pre>
getenv('TEST_VARIABLE') = <?php print getenv('TEST_VARIABLE'); ?>
getenv('REDIRECT_TEST_VARIABLE') = <?php print getenv('REDIRECT_TEST_VARIABLE'); ?>
</pre>
Run Code Online (Sandbox Code Playgroud)
在我的本地服务器上,正确返回test.php:
getenv('TEST_VARIABLE') = test_value
getenv('REDIRECT_TEST_VARIABLE') =
Run Code Online (Sandbox Code Playgroud)
但是在生产服务器上,它返回:
getenv('TEST_VARIABLE') =
getenv('REDIRECT_TEST_VARIABLE') =
Run Code Online (Sandbox Code Playgroud)
我已经排除的事情:
mod_env主机未安装/启用.不能,因为那时候SetEnv不会被识别,我在处理.htaccess时会得到500.
AllowOverrides在httpd.conf这个目录中不包括FileInfo.不可能,因为当遇到SetEnv指令时,Apache会抛出一个错误"SetEnv不允许在这里" ,我会再次获得500.
variables_order在php.ini中不包含'E'.这可以解释$_ENV超全局是空的(它是),但不是为什么getenv()不返回这些变量的值.
整个环境搞砸了.不能,因为getenv('PATH')和getenv('SERVER_NAME')仍然返回有效值.
在这一点上,我不知道是什么配置可能导致这一点.
我不认为使用setenv通常在.htaccess中工作.这是一个shell脚本命令(bash,C shell等).如果您的服务器不支持SETENV,根据https://kb.mediatemple.net/questions/36/Using+Environment+Variables+in+PHP#gs你需要有变量名开始与HTTP_.
如果您在 Mac 上运行您的家庭服务器或启用了 suEXEC,则有一些安全措施可以去除定义的任何非 http 环境变量,因此它们不会出现在 $_ENV['APPLICATION_ENV'] 中。但是,您可以通过本机 PHP 函数访问它们以获得相同的结果。
$var = apache_getenv('APPLICATION_ENV');
Run Code Online (Sandbox Code Playgroud)
该函数将获取在 .htaccess 文件中使用 SetEnv 定义的任何环境变量,或在 php.ini 中设置的任何环境变量,即使 PHP 从 $_ENV 变量中删除了这些变量。
如果需要,您可以在 PHP 中定义环境变量,但不建议这样做。
$_ENV['APPLICATION_ENV'] = apache_getenv('APPLICATION_ENV');
Run Code Online (Sandbox Code Playgroud)
或者更好的解决方案:只需定义一个全局:
define('APPLICATION_ENV', apache_getenv('APPLICATION_ENV'));
Run Code Online (Sandbox Code Playgroud)
一旦你这样做了,它应该能按预期工作。