我已经阅读了很多有关该主题的帖子并尝试了几种解决方案,但没有找到工作位置。
我在 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;
}
感谢您的帮助?
您的访问者的 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;
}
添加http配置set_real_ip_from
http {
...
set_real_ip_from 172.19.0.5/16 # ip of Nginx server;
为了能够将真实 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/
正确的方法是在服务器级别设置真实IP解析
这样做的好处。是让整个堆栈自然地工作而无需修改和整个堆栈。另外,如果您对堆栈进行修改。一切将继续工作,无需重新设置。
此外,使用此类
real-ip
模块会增加 trust security
。
如 Cloudflare 文档所述。旧的 Cloudflare 模块已弃用。并且您必须使用 Apache 和 Nginx 特定的专用模块。
https://developers.cloudflare.com/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/🔥 一本好书。
我在这里的回答显示了一个完整的示例并解释了细节,它又长又详细
🔥🔥 https://stackoverflow.com/a/76845593/7668448 🔥🔥
积分
$remote_addr
变量$proxy_add_x_forwarded_for
变量mod_remoteip
模块