我正在尝试将.htaccess中的环境变量传递给PHP。这在我的本地WAMP服务器上运行得很好,但是在托管我的网站的服务器上,它无故失败。
这是我的测试配置:
htaccess的:
SetEnv TEST_VARIABLE test_value
test.php的:
<pre>
getenv('TEST_VARIABLE') = <?php print getenv('TEST_VARIABLE'); ?>
getenv('REDIRECT_TEST_VARIABLE') = <?php print getenv('REDIRECT_TEST_VARIABLE'); ?>
</pre>
在我的本地服务器上,正确地返回test.php:
getenv('TEST_VARIABLE') = test_value
getenv('REDIRECT_TEST_VARIABLE') =
但是在生产服务器上,它返回:
getenv('TEST_VARIABLE') =
getenv('REDIRECT_TEST_VARIABLE') =
我排除的事情:
mod_env
未由主机安装/启用。不能,因为那时SetEnv
将无法被识别,我在处理.htaccess时会得到500.
AllowOverrides
中的 httpd.conf
不包含FileInfo
。不能,因为当遇到SetEnv
指令时,Apache会抛出一个错误“SetEnv不允许在这里”,我会再次得到500.
variables_order
不包含'E'。这可以解释$_ENV
超全局为空(它是),但不是为什么getenv()
不返回这些变量的值。
整个环境搞砸了。不能,因为getenv('PATH')
和getenv('SERVER_NAME')
仍然返回有效值。
此时我对于导致此问题的配置感到茫然。
答案 0 :(得分:9)
我不认为使用setenv通常可以在.htaccess中使用。这是一个shell脚本命令(bash,C shell等)。如果您的服务器 支持setenv,则根据https://kb.mediatemple.net/questions/36/Using+Environment+Variables+in+PHP#gs,您需要将变量名称以HTTP _开头。
答案 1 :(得分:4)
如果您在Mac上运行家庭服务器或启用了suEXEC,则会采取安全措施来删除所定义的任何非http环境变量,因此它们不会出现在$ _ENV ['APPLICATION_ENV']中。但是,您可以通过本机PHP函数访问这些内容以获得相同的功能。
$var = apache_getenv('APPLICATION_ENV');
该函数将获取在.htaccess文件中使用SetEnv定义的任何环境变量,或者在php.ini中设置的任何环境变量,即使PHP从$ _ENV变量中删除它们。
然后,您可以根据需要在PHP中定义环境变量,但不建议这样做。
$_ENV['APPLICATION_ENV'] = apache_getenv('APPLICATION_ENV');
或者更好的解决方案:只需定义一个全局:
define('APPLICATION_ENV', apache_getenv('APPLICATION_ENV'));
一旦你这样做,它应该按照需要工作。