当 Apache/PHP 服务器位于 Nginx 反向代理之后时,如何使用 Apache remoteip 重写它收到的远程地址?

当 Apache/PHP 服务器位于 Nginx 反向代理之后时,如何使用 Apache remoteip 重写它收到的远程地址?

我有一个 Apache 2.4 和 PHP 5.4 应用程序,大量使用了SERVER['REMOTE_ADDR']

基础设施正在经历变革,最近我们部署了一个充当反向代理的 Nginx。代理正确添加了X-Real-IPX-Forwarded-For标头,均显示真实的客户端 IP。为了便于移植,我们还将 Apache/PHP 应用程序和 Nginx 代理都容器化了。它们部署在两个不同的主机上,通过外部 IP 相互通信(将来将更改为私有网络)。

我无法修改应用程序,但我可以修改 Apache 配置。

我已启用 remoteip 模块,它是 mod_rpaf 的替代品。我尝试了几种配置,例如:

RemoteIPProxiesHeader X-Forwarded-For
RemoteIPInternalProxy <external ip of the proxy>

或者

RemoteIPProxiesHeader X-Forwarded-For
RemoteIPTrustedProxy <external ip of the proxy>

以及一些~Proxy变量的组合。

无论如何,运行时phpinfo()我得到以下输出:

HTTP_X_REAL_IP          <my real client ip>
HTTP_X_FORWARDED_FOR    <my real client ip>
SERVER_ADDR             <the Apache/PHP docker machine's ip>
REMOTE_ADDR             <external ip of the proxy>

关于如何正确配置 remoteip 模块有什么想法吗?

答案1

Apache 2.4 附带的 remoteip 模块似乎不起作用。我从 Github 上获取了 mod_rpaf 的最新稳定版本 (v0.8.4)。编译并安装,修改默认配置如下:

<IfModule mod_rpaf.c>
  RPAF_Enable       On
  RPAF_ProxyIPs     <external ip of the proxy>
  RPAF_Header       X-Forwarded-For
  RPAF_SetHostName  On
  RPAF_SetHTTPS     On
  RPAF_SetPort      On
</IfModule>

而且效果非常好。

相关内容