Apache 2.4 + PHP-FPM 和授权标头

问题描述 投票:0回答:6

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

长版: 我正在运行带有 Apache 2.4 和 PHP-FPM 的服务器。我使用 APC 进行操作码缓存和用户缓存。按照网上的建议,我使用 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 没有将授权 HTTP 标头传递给外部 FastCgi 进程。不幸的是,我只找到了 mod_fastcgi 的修复程序,如下所示:

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

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

apache http apc mod-proxy php
6个回答
108
投票

各种 Apache 模块都会去除

Authorization
标头,通常是出于“安全原因”。它们都有不同的模糊设置,您可以调整以否决此行为,但您需要准确确定应该归咎于哪个模块。

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

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

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

在某些情况下,即使这样也不能直接工作,您还必须更改 PHP 代码以访问

$_SERVER['REDIRECT_HTTP_AUTHORIZATION']
而不是
$_SERVER['HTTP_AUTHORIZATION']
。请参阅在 Apache RewriteRule 指令中设置环境变量时,是什么导致变量名称带有“REDIRECT_”前缀?


59
投票

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

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

CGIPassAuth on

详情请参阅此处


3
投票

最近我对这个拱门没有遇到问题。

在我的环境中,php-fpm 的代理配置如下:

<IfModule proxy_module>
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache2/htdocs/$1
    ProxyTimeout 1800
</IfModule>

我解决了设置 SetEnvIf 指令的问题,如下所示:

<IfModule proxy_module>
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache2/htdocs/$1
    ProxyTimeout 1800
</IfModule>

1
投票

我已经添加了

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

VirtualHost 节点内部

<VirtualHost *:80>
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

0
投票

这是我需要添加的内容,以使其适用于特定主机。无论出于何种原因,密钥是“REDIRECT_HTTP_AUTHORIZATION”而不是“HTTP_AUTHORIZATION”

RewriteRule . /index.php [L,E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

$token = $_SERVER['HTTP_AUTHORIZATION'] ?? ($_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ?? null);

-2
投票

我没有找到任何与 mod_proxy_fcgi 类似的设置,但它默认对我有用。它要求用户授权(像往常一样.htaccess),并且 php 获取它,并且与 mod_php 或 fastcgi 和 pass-header 一起工作。不知道有没有帮到你...

编辑: 它仅在使用 DirectoryIndex 时在 teszt.com/ 上工作...如果我传递 php 文件名(即使是 index.php!),它就不起作用,不要将身份验证传递给 php。这对我来说是一个阻碍,但我不想降级到 apache 2.2(和 mod_fastgi),所以我迁移到 nginx(也在这台机器上)。

© www.soinside.com 2019 - 2024. All rights reserved.