当以 CGI 形式运行 php 时,如何防止 Apache 将 REDIRECT_ 添加到环境变量中?

当以 CGI 形式运行 php 时,如何防止 Apache 将 REDIRECT_ 添加到环境变量中?

我一直使用 MediaTemple 的 GridService 作为几个相对轻量级 PHP 站点的生产环境。设置测试和准备环境的过程有点繁琐,导致工作人员走捷径,因此我试图组建一个质量控制环境,该环境提供与 GridService 类似的环境,但允许我将其更紧密地连接到我们的自动部署过程(在 GridService 中配置新环境需要您使用 Web 界面;mod_vhost_alias 只允许我们创建作为测试 URL 子域的目录)。

我已经非常接近了,但遇到了一个问题 - 当 PHP 作为 CGI 运行时,apache 会自动将 REDIRECT_ 添加到我在 .htaccess 中设置的任何变量(记住,我正在模拟 GridService)中,使用 SetEnv。例如:

.htaccess

SetEnv HTTP_TEST_VAR "Some Value"

PHP

echo getenv('HTTP_TEST_VAR'); // prints ""
echo getenv('REDIRECT_HTTP_TEST_VAR'); // prints "Some Value"

这没什么大不了的(我们可以围绕它编写代码),只是它不会发生在 GridService 中,我真的希望有相同的代码路径(在代码中添加切换逻辑会破坏我们为从代码库中获取配置而进行的所有工作)。

对于其余的背景,我使用一个运行 Ubuntu 的全新(2 周前)(ve)实例,从 apt 获取 apache 和所有依赖项,并使用来自<?php phpinfo() ?>GridService 的配置字符串构建 PHP(5.3.15),减去 db4 支持。

我将非常感激您的帮助。谢谢!

答案1

不知道这是否是一个好的解决方案,但在 FastCGI 模式(mod_fastcgi)下运行的 PHP 可以使用 SetEnv 变量正常运行,而无需在其前面添加 REDIRECT_。

在 CGI 模式下运行 PHP 时遇到同样的问题,通过切换到 FastCGI 解决了。

答案2

我认为您无法使用 php-cgi 更改此行为,因为它实际上是一种重定向。但请注意,php getenv() 函数返回值

返回环境变量 varname 的值,如果环境变量 varname 不存在,则返回 FALSE。

因此您可以轻松构建一个返回值的函数,无论它是否是 REDIRECT_。

相关内容