来自用户的REMOTE_ADDR IP,而不是Nginx反向代理服务器

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

我已经阅读了很多有关该主题的帖子并尝试了几种解决方案,但没有找到工作位置。

我在 Apache 服务器前面设置了 Nginx 反向代理。当我的 php 应用程序使用 REMOTE_ADDR 函数时,它会获取 Nginx 服务器的 IP,而不是从用户那里获取。

我使用的是 Apache 2.4.10,所以应该安装 module_remoteip.c。但它没有加载。

因此我安装了rpaf_module。看起来这个模块已正确安装,phpinfo() mod_rpaf-2 与加载的模块一起显示。我修改了 /etc/apache2/mods-available/rpaf.conf 文件,内容如下:

<IfModule rpaf_module>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 172.19.0.5 # ip of Nginx server
    RPAFheader X-Forwarded-For
</IfModule>

我的 Nginx 配置如下所示:

location / {
    proxy_set_header X-Real-Ip $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass 172.19.0.4;
}

感谢您的帮助?

php apache nginx proxy
4个回答
12
投票

您的访问者的 IP 地址应该可以使用

访问
$_SERVER['HTTP_X_REAL_IP'];

而不是

$_SERVER['REMOTE_ADDR'];

如果您想替换

REMOTE_ADDR
标头,请在您的 NGINX 配置中尝试此操作:(并且不要忘记重新加载/重新启动您的 NGINX 服务器)

location / {
    proxy_set_header X-Real-Ip $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_set_header REMOTE_ADDR $remote_addr;
    proxy_pass 172.19.0.4;
}

1
投票

添加http配置set_real_ip_from

http {
...
set_real_ip_from 172.19.0.5/16 # ip of Nginx server;


0
投票

为了能够将真实 IP 放入 $remote_addr 变量中,您需要类似的东西:

http {
...
  real_ip_header      proxy_protocol;
  real_ip_recursive   on;
  set_real_ip_from    0.0.0.0/0;
...
  server {
    ...
    listen 80   proxy_protocol;
    listen 443  ssl proxy_protocol;
    ...
  }
...
}

https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/


0
投票

真实ip解析才是正道

正确的方法是在服务器级别设置真实IP解析

这样做的好处。是让整个堆栈自然地工作而无需修改和整个堆栈。另外,如果您对堆栈进行修改。一切将继续工作,无需重新设置。

  • Apache 及其所有模块
  • Apache 背后的应用程序和框架以及所有库
  • nginx 也一样
  • 简而言之就是整个堆栈。变量是在每个堆栈或层级别定义的。并取决于它们上面的层。

此外,使用此类

real-ip
模块会增加
trust security

  • 只有定义的可信 IP 才会用于设置真实 IP。

在 Cloudflare 落后且模块已弃用的情况下

如 Cloudflare 文档所述。旧的 Cloudflare 模块已弃用。并且您必须使用 Apache 和 Nginx 特定的专用模块。
https://developers.cloudflare.com/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/🔥 一本好书。

详细解释答案并举例

我在这里的回答显示了一个完整的示例并解释了细节,它又长又详细
🔥🔥 https://stackoverflow.com/a/76845593/7668448 🔥🔥

  • 🔥Apache 端🔥 包含有关如何在 Apache 中进行设置的信息。否则,您将对任何类型的服务器有一个一般了解。

积分

  • 双方交易
    • 一侧设置标头(代理)
    • 一侧使用标头进行解析并设置真实IP(覆盖内部变量)
      • 正确的方法。因为它允许所有堆栈默认值自然地工作
  • 设置真实IP是什么意思(Nginx,Apache,....)
  • Cloudflare => Nginx => Apache 情况示例
  • 代理端(Nginx 示例)
  • 为什么我们应该使用real-ip模块
    • 信任安全
  • 所有元素的详细信息
    • 真实IP模块
    • X-Forward-for 标头及其工作原理
    • $remote_addr
      变量
    • $proxy_add_x_forwarded_for
      变量
  • 常用标题
  • 设置标题
  • 🔥 阿帕奇方面 🔥。 🔥<=============================🔥
    • mod_remoteip
      模块
    • 有关设置配置的全部详细信息
  • 设置真实 IP,与仅记录标头
  • 一些标头调试技巧(Apache 和 nginx)
© www.soinside.com 2019 - 2024. All rights reserved.