Apache 2.4+;PHP-FPM和授权头

Apache 2.4+;PHP-FPM和授权头,apache,http,apc,mod-proxy,php,Apache,Http,Apc,Mod Proxy,Php,摘要: Apache2.4的mod_代理似乎没有将授权头传递给PHP-FPM。有办法解决这个问题吗 长版本: 我正在运行一个带有Apache2.4和PHP-FPM的服务器。我将APC用于操作码缓存和用户缓存。根据互联网的建议,我使用Apache 2.4的mod_proxy_fcgi将请求代理给FPM,如下所示: ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/foo/bar/$1 安装工作正常,除了一件事:APC的捆绑APC.php(用于监视

摘要: Apache2.4的mod_代理似乎没有将授权头传递给PHP-FPM。有办法解决这个问题吗

长版本: 我正在运行一个带有Apache2.4和PHP-FPM的服务器。我将APC用于操作码缓存和用户缓存。根据互联网的建议,我使用Apache 2.4的mod_proxy_fcgi将请求代理给FPM,如下所示:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/foo/bar/$1
安装工作正常,除了一件事:APC的捆绑APC.php(用于监视APC的状态)不允许我登录(查看用户缓存条目所需)。当我点击“用户缓存条目”查看用户缓存时,它会要求我登录,点击登录按钮会显示通常的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

我没有在mod_proxy_fcgi中找到任何类似的设置,但它在默认情况下只适用于我。它要求用户授权(.htaccess照常),php获得授权,并与mod_php或fastcgi和pass header类似。我不知道我是否帮了忙

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

各种apache模块将剥离
授权
头,通常是出于“安全原因”。它们都有不同的模糊设置,你可以通过调整来推翻这种行为,但你需要确定到底是哪个模块造成的

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

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


在某些情况下,即使这样也无法直接工作,您还必须更改PHP代码以访问
$\u服务器['REDIRECT\u HTTP\u AUTHORIZATION']
,而不是
$\u服务器['HTTP\u AUTHORIZATION']
。请参见

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

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

CGIPassAuth on

有关详细信息,请参阅。

感谢您提供的“-通过标题授权”片段!帮助我解决了fastcgi问题。这可能会帮助PHP5.5+和Apache2.4用户。将SetEnvIf Authorization“(.*)”HTTP_Authorization=$1添加到.htaccess后,必须使用$_SERVER['REDIRECT_HTTP_Authorization']变量,而不是$_SERVER['HTTP_Authorization']。在.htaccess或/etc/httpd/confthanker中将此=?”添加到apache配置中。这对我很有用。太棒了——刚刚救了我们公司!我希望我能升级100次。请注意,这只适用于Apache 2.4.13或更高版本,也就是说,从15.10开始不适用于任何版本的Ubuntu。此解决方案更有意义,因为它更接近于禁用传递身份验证头的代理设置,即:SetHandler“proxy:fcgi://127.0.0.1:9000“CGIPassAuth对这个问题的回答肯定是最好的。注意:这仅在使用
SetHandler
而不是旧的
ProxyPassMatch
方法时有效。