使用apache服务器在PHP应用程序中获取客户端ip

使用apache服务器在PHP应用程序中获取客户端ip,php,apache,amazon-web-services,ip-address,clientip,Php,Apache,Amazon Web Services,Ip Address,Clientip,我是PHP新手,我有一项任务要做地理定位 我想在我的php应用程序中获得客户端ip。该应用程序部署在AWS上,有2个负载平衡器和apache web服务器 我尝试过以下方法: if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) { $ipAddress = $_SERVER['HTTP_CLIENT_IP']; } elseif (array_key_exists('HTTP_X_FORWARDED', $_SERV

我是PHP新手,我有一项任务要做地理定位

我想在我的php应用程序中获得客户端ip。该应用程序部署在AWS上,有2个负载平衡器和apache web服务器

我尝试过以下方法:

    if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
        $ipAddress = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (array_key_exists('HTTP_X_FORWARDED', $_SERVER)) {
        $ipAddress = $_SERVER['HTTP_X_FORWARDED'];
    } elseif (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
        $ipAddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (array_key_exists('HTTP_FORWARDED_FOR', $_SERVER)) {
        $ipAddress = $_SERVER['HTTP_FORWARDED_FOR'];
    } elseif (array_key_exists('HTTP_FORWARDED', $_SERVER)) {
        $ipAddress = $_SERVER['HTTP_FORWARDED'];
    } elseif (array_key_exists('REMOTE_ADDR', $_SERVER)) {
        $ipAddress = $_SERVER['REMOTE_ADDR'];
    } else {
        $ipAddress = '';
    }
我原以为它会起作用,但没有。然后我查看了phpinfo,发现了以下内容:

标题中
X-Forwarded-For
设置为10.1.29.16

$\u服务器['HTTP\u X\u FORWARDED\u']
设置为10.1.29.16,并且

$\u服务器['REMOTE\u ADDR']
是172.17.7.173

都是内部IP地址

谁能告诉我,我怎样才能找到真正的客户的ip地址

附言:
这是一个Symfony 4应用程序。

您正在按错误的顺序检查标题。首先检查转发的类型。您需要查看实例前面的服务器(负载平衡器等)文档,以了解要引用的头
HTTP\u X\u FORWARDED\u FOR
可能是最常见的。你在盲目地检查任何东西

您假设标头包含一个值。如果有一个服务器链,那么每个服务器都将添加其地址。例如,带有ALB的Cloudfront


$\u服务器['REMOTE\u ADDR']
不可靠,不应信任。实际上,除非您控制整个链(缓存、负载平衡等),否则不应该信任任何头。伪造这些值非常容易。

这取决于代理/负载平衡器如何(如果有的话)将原始IP传递到服务器。感谢John的回复。我从某个博客上获取了代码,所以我不完全确定应该按什么顺序放置它们。关于负载平衡器,我一定会检查一下。转发的意思是你指的是HTTP_X_转发的意思吗?是的,对于AWS服务,它是HTTP_X_转发的意思。但是,请检查您正在使用的服务的文档,因为您在问题中没有指定此项。确定。我没有提到这件事,因为我无法接触到:D,但很快我就会知道的。感谢您的帮助。@Pradeepb还请注意,
$\u服务器['REMOTE\u ADDR']
不可靠,不应信任。实际上,除非您控制整个链(缓存、负载平衡等),否则不应该信任任何头。打造这些价值观非常容易。这是个好消息。也许你可以将它添加到你的答案中,因为其他正在查看的人很容易发现它很有用。:)