负载均衡器 $_SERVER['REMOTE_ADDR'] 不工作
Posted
技术标签:
【中文标题】负载均衡器 $_SERVER[\'REMOTE_ADDR\'] 不工作【英文标题】:Load Balancer $_SERVER['REMOTE_ADDR'] Not working负载均衡器 $_SERVER['REMOTE_ADDR'] 不工作 【发布时间】:2016-07-23 05:55:36 【问题描述】:我已切换到使用 Amazon AWS Elastic Load Balancer,现在我获得了 $_SERVER['REMOTE_ADDR']
的私有 IP 地址 - 用于给我客户端的 IP 地址。
我现在如何获取客户端 IP 地址?
【问题讨论】:
如果负载均衡器没有设置带有客户端 IP 地址的标头,那么您将无法获取客户端的 IP 地址。您可能会查看$_SERVER
超全局并查看是否有这样的标题(例如称为HTTP_X_FORWARDED_FOR
)。
docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/…
Apache、nginx 还是其他?每个都有一种获取 X-Forwarded-For 地址并使用它的方法。
@CharlotteDunois 所以我可以使用 $_SERVER['HTTP_X_FORWARDED_FOR'];? :)
夏洛特说得对。你应该把它写成答案。
【参考方案1】:
您的网络服务器接收来自 Amazon ELB 的 HTTP 请求。因此,远程地址将始终是 ELB ip 地址之一。 如果您需要 ELB 后面的远程主机地址,请从 HTTP 标头“X-Forwarded-For”获取。
【讨论】:
X-Forwarded-For 正在返回:“192.155.96.40, 54.240.144.13” - 知道为什么它返回两个地址以及它们是什么吗? 是的,您可能需要第一个地址。 ELB 可以返回多个地址,如 docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/… 中所述:如果请求通过多个代理,则 X-Forwarded-For 请求标头中的 clientIPAddress 后面是请求在其之前通过的每个连续代理的 IP 地址到达您的负载均衡器。因此,最右边的 IP 地址是最近代理的 IP 地址,最左边的 IP 地址是原始客户端的 IP 地址。 嗯,没错,但我想我只会相信最右边的那个。我真的不相信来自客户端的任何东西...... 更正 - 右边的仍然是亚马逊 IP - 所以是的,我认为是最左边的 :)【参考方案2】:以下内容适用于我在 httpd.conf 定义 LogFormat 的全局部分。通过以下更改,$_SERVER['REMOTE_ADDR']
将设置为 php-fpm 上的客户端 ip,而不是 ELB ip。
<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
LogFormat "%a %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %b" common
</IfModule>
解决方案来自https://medium.com/@jiraknet/apache-2-4-mod-remoteip-for-get-real-ip-on-aws-elb-6e9f40876b06
【讨论】:
这实际上是一个很好且简单的解决方案,如果您愿意,可以将其称为“hack”,但简单干净,唯一的缺点是您丢失了转发请求的代理 ip,如果您不是使用它你绝对可以使用这个解决方案以上是关于负载均衡器 $_SERVER['REMOTE_ADDR'] 不工作的主要内容,如果未能解决你的问题,请参考以下文章