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

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)

我已经排除的事情:

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

  2. AllowOverrideshttpd.conf这个目录中不包括FileInfo.不可能,因为当遇到SetEnv指令时,Apache会抛出一个错误"SetEnv不允许在这里" ,我会再次获得500.

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

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

在这一点上,我不知道是什么配置可能导致这一点.

Phi*_*rry 9

我不认为使用setenv通常在.htaccess中工作.这是一个shell脚本命令(bash,C shell等).如果您的服务器支持SETENV,根据https://kb.mediatemple.net/questions/36/Using+Environment+Variables+in+PHP#gs你需要有变量名开始与HTTP_.

  • SetEnv _is_是一个.htaccess命令,但你把它钉了下来:一旦我用HTTP_作为变量前缀,一切正常.我没有看到任何"官方"来源中记录的要求,这很奇怪,但嘿,如果它有效,请不要触摸它,对吧? (5认同)

Bra*_*hde 5

如果您在 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)

一旦你这样做了,它应该能按预期工作。