使用NGINX代理时如何获取PHP Apache中REMOTE_ADDR中的真实客户端IP?

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

我最近使用 Apache 和 NGINX 反向代理切换到 VestaCP。很快我注意到所有传入流量都被记录为服务器 IP 地址。这是 Apache 只能看到 NGINX 代理服务器的 IP 地址,是我自己的服务器 IP。

使用

phpinfo()
我可以验证客户端 IP 是否已在
HTTP_X_FORWARDED_FOR
HTTP_X_REAL_IP
中正确转发,但未正确添加到
REMOTE_ADDR

我已经尝试通过在 NGINX 配置文件中添加以下内容来确保 IP 正确地从 NGINX 转发到 Apache:

fastcgi_param REMOTE_ADDR $http_x_real_ip;

proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

这绝对是正确的方向,因为我可以看到值

$_SERVER['HTTP_X_REAL_IP']
显示了正确的 IP 地址。 然而,这似乎对
$_SERVER['REMOTE_ADDR']
没有任何作用。

我还遇到了一些其他模糊的建议,例如手动设置IP地址,但这从未起到任何作用:

set_real_ip_from   192.168.122.1;

我不能简单地使用

$_SERVER['HTTP_X_REAL_IP']
,因为我使用的框架是通过硬编码来使用
$_SERVER['REMOTE_ADDR']

apache nginx proxy ip-address vestacp
1个回答
0
投票

为了让它发挥作用,我做了以下工作:

  1. 我使用以下命令安装了 Apache

    remoteip
    模块:

    sudo a2enmod remoteip &&  systemctl restart apache2
    
  2. /etc/nginx/nginx.conf
    中,我确保在
    http {}
    块中添加以下行

    proxy_set_header    X-Client-IP       $remote_addr;
    
  3. 然后我根据

    Apache 文档
    将以下代码块添加到我的 /home/admin/conf/web/sitename.apache2.conf

    <IfModule mod_remoteip.c>
    RemoteIPHeader X-Client-IP
    </IfModule>
    

确保 NGINX(步骤 2)和 Apache(步骤 3)都使用完全相同的变量名称

X-Client-IP
似乎已经成功了。

现在它使用转发的客户端 IP 地址正确填充了

REMOTE_ADDR

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