10

我正在尝试将环境变量从 .htaccess 传递给 PHP。这在我的本地 WAMP 服务器上工作得很好,但在我的网站托管的服务器上,它会无缘无故地失败。

这是我的测试配置:

.ht 访问:

SetEnv TEST_VARIABLE test_value

测试.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这个目录的 inhttpd.conf不包括FileInfo. 不能,因为 Apache 在遇到SetEnv指令时会抛出错误“SetEnv not allowed here”,我会再次得到 500。

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

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

在这一点上,我不知道什么配置可能导致这种情况。

4

2 回答 2

9

我不认为使用 setenv 通常在 .htaccess 中有效。它是一个 shell 脚本命令(bash、C shell 等)。如果您的服务器确实支持 setenv,根据https://kb.mediatemple.net/questions/36/Using+Environment+Variables+in+PHP#gs您需要让变量名以 HTTP_ 开头。

于 2013-06-12T18:59:27.013 回答
5

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

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

于 2013-07-28T21:56:44.753 回答