环境变量不会从.htaccess传递给PHP

时间:2013-06-12 18:53:48

标签: php apache cgi environment-variables

我正在尝试将.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') = 

我排除的事情:

  1. mod_env未由主机安装/启用。不能,因为那时SetEnv将无法被识别,我在处理.htaccess时会得到500.

  2. 此目录的AllowOverrides中的
  3. httpd.conf不包含FileInfo。不能,因为当遇到SetEnv指令时,Apache会抛出一个错误“SetEnv不允许在这里”,我会再次得到500.

  4. php.ini中的
  5. variables_order不包含'E'。这可以解释$_ENV超全局为空(它是),但不是为什么getenv()不返回这些变量的值。

  6. 整个环境搞砸了。不能,因为getenv('PATH')getenv('SERVER_NAME')仍然返回有效值。

  7. 此时我对于导致此问题的配置感到茫然。

2 个答案:

答案 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'));

一旦你这样做,它应该按照需要工作。