47

摘要: Apache 2.4 的 mod_proxy 似乎没有将 Authorization 标头传递给 PHP-FPM。有没有什么办法解决这一问题?

长版: 我正在使用 Apache 2.4 和 PHP-FPM 运行服务器。我将 APC 用于操作码缓存和用户缓存。根据 Internet 的建议,我使用 Apache 2.4 的 mod_proxy_fcgi 将请求代理到 FPM,如下所示:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/foo/bar/$1

设置工作正常,除了一件事:用于监视 APC 状态的 APC 捆绑的 apc.php 不允许我登录(查看用户缓存条目所需的)。当我单击“用户缓存条目”查看用户缓存时,它要求我登录,单击登录按钮会显示通常的 HTTP 登录表单,但输入正确的登录名和密码不会成功。当使用 mod_php 而不是 mod_proxy + php-fpm 运行时,此功能可以完美运行。

经过一番谷歌搜索后,我发现其他人也有同样的问题,并发现这是因为 Apache 没有将 Authorization HTTP 标头传递给外部 FastCgi 进程。不幸的是,我只找到了 mod_fastcgi 的修复程序,看起来像这样:

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization

是否有等效的设置或一些解决方法也适用于 mod_proxy_fcgi?

4

3 回答 3

101

各种 Apache 模块会剥离Authorization标题,通常是出于“安全原因”。它们都有不同的模糊设置,您可以对其进行调整以推翻此行为,但您需要准确确定应归咎于哪个模块。

您可以通过 env 将标头直接传递给 PHP 来解决此问题:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

另请参阅Zend Server Windows - 授权标头未传递给 PHP 脚本

在某些情况下,即使这样也不能直接工作,您还必须将 PHP 代码更改为 access$_SERVER['REDIRECT_HTTP_AUTHORIZATION']而不是$_SERVER['HTTP_AUTHORIZATION']. 请参阅在 Apache RewriteRule 指令中设置环境变量时,是什么导致变量名称以“REDIRECT_”为前缀?

于 2013-07-05T14:06:07.177 回答
54

这花了我很长时间才破解,因为它没有记录在 mod_proxy 或 mod_proxy_fcgi 下。

将以下指令添加到您的 apache conf 或 .htaccess:

CGIPassAuth on

有关详细信息,请参见此处

于 2015-10-21T08:47:01.833 回答
-2

我没有找到任何与 mod_proxy_fcgi 类似的设置,但默认情况下它只适用于我。它要求用户授权(.htaccess 像往常一样)并且 php 得到它,并且与 mod_php 或 fastcgi 和 pass-header 一样工作。不知道有没有帮助...

编辑:当使用 DirectoryIndex 时,它仅适用于 teszt.com/... 这对我来说是一个障碍,但我不想降级到 apache 2.2(和 mod_fastgi),所以我迁移到 nginx(也在这台机器上)。

于 2013-07-05T12:54:14.490 回答