【问题标题】:Environment variables are not passed from .htaccess to PHP环境变量不会从 .htaccess 传递到 PHP
【发布时间】:2013-06-09 00:24:02
【问题描述】:

我正在尝试将环境变量从 .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. 此目录的httpd.conf 中的AllowOverrides 不包括FileInfo。不可能,因为 Apache 在遇到 SetEnv 指令时会抛出错误“SetEnv not allowed here”,我会再次得到 500。

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

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

此时我不知道是什么配置导致了这种情况。

【问题讨论】:

    标签: php apache cgi environment-variables


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • SetEnv is 是一个 .htaccess 命令,但您成功了:一旦我在变量前面加上 HTTP_,一切正常。我还没有看到任何“官方”来源中记录的要求,这很奇怪,但是嘿,如果它有效,请不要碰它,对吧?
      • 对于 RewriteRule .* - (E=HTTP_VAR:VAL) 在某些服务器上似乎也有同样的要求。
      • 刚刚遇到了同样的问题,很奇怪,它没有在任何地方记录。就我而言,这不是在 PHP 脚本中发生的,而是在 Perl 中发生的。
      • 有人在任何地方发现过这个文件吗?好奇怪!
      • 似乎 suexec 会在调用 PHP 之前清理环境,从而丢弃您的 SetEnv 变量。 HTTP_ 技巧将适用于已编译 suexec 以允许它的服务器。
      猜你喜欢
      • 2018-12-15
      • 2019-09-13
      • 2023-03-08
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      相关资源
      最近更新 更多