Apache 2.4 + PHP-FPM和Authorization头文件

yiytaume  于 2023-03-24  发布在  Apache
关注(0)|答案(5)|浏览(144)

**总结:**Apache2.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.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?

kq4fsx7k

kq4fsx7k1#

各种Apache模块会剥离Authorization头,通常是出于“安全原因”。它们都有不同的模糊设置,您可以调整以阻止这种行为,但您需要确切地确定哪个模块是罪魁祸首。
你可以通过env直接将头文件传递给PHP来解决这个问题:

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

另请参见Zend Server Windows - Authorization header is not passed to PHP script
在某些情况下,即使这样也不能直接工作,您还必须更改PHP代码以访问$_SERVER['REDIRECT_HTTP_AUTHORIZATION']而不是$_SERVER['HTTP_AUTHORIZATION']

wj8zmpe1

wj8zmpe12#

这花了我很长时间来破解,因为它没有记录在mod_proxy或mod_proxy_fcgi下。
将以下指令添加到apache conf或.htaccess中:

CGIPassAuth on

详情请参见此处。

4uqofj5v

4uqofj5v3#

最近我对这个拱门没什么问题。
在我的环境中,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>
ttygqcqt

ttygqcqt4#

我添加了

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

在VirtualHost节点中

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

mrfwxfqh5#

我没有找到任何类似的设置与mod_proxy_fcgi,但它只是为我默认工作.它要求用户授权(.htaccess像往常一样)和php得到它,并与mod_php或fastcgi和pass-header一样工作.我不知道如果我是有帮助的...
编辑:只有在www.example.com上teszt.com/使用DirectoryIndex时才有效...如果我传递php文件名(即使是index.php!),它就不起作用,不要传递auth给php。这对我来说是一个拦截器,但我不想降级到apache2.2(和mod_fastgi),所以我迁移到nginx(在这台机器上也是)。

相关问题