【问题标题】:Why am I getting two IP Addresses?为什么我得到两个 IP 地址?
【发布时间】:2024-01-16 01:02:01
【问题描述】:

问题

我使用 php 和一个 api 来使用用户 IP 来获取本地货币。它已经工作了一段时间,但突然间,我的 ISP 不断给我两个 IP 地址。

通常,如果我回显$ipaddress,我会得到类似xxx.xxx.xxx.xxx 的内容,因此它会像这样通过API

https://usercountry.com/v1.0/json/xxx.xxx.xxx.xxx?token=<API KEY>

但最近$ipaddress 给了我两个 IP(不同的 IP 地址)像这样xxx.xxx.xxx,yyy.yyy.yyy

所以现在它像这样通过 API https://usercountry.com/v1.0/json/xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy?token=&lt;API KEY&gt;

返回错误是因为 UserCountry.com 不允许双 IP

每当发生双重 IP 时,我都会使用此检查

if (strlen($ipaddress) > 15){
     $ipaddress = "Double IP";
}

我的分析

$ipaddress= xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy

当它发生时,第一个 IP (xxx.xxx.xxx.xxx) 似乎是真实的(IP 与我在同一个国家),但第二个 IP (yyy.yyy.yyy.yyy) 与我不在同一个国家,

我想要什么

所以我想写一个 php 代码来回显来自xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy 的第一个 IP 地址(xxx.xxx.xxx.xxx)

谢谢

编辑

有些人想知道我如何获得$ipaddress的IP地址

if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];

当我使用http://ip-api.com/检查我的IP地址时,我实际上得到了两个IP地址 xxx.xxx.xxx,yyy.yyy.yyy

【问题讨论】:

  • $ipaddress 不是 PHP 程序中默认设置的变量。如果不知道你是如何为它分配一个值的,就无法说明为什么你会得到任何特定的值。
  • 我写了一个函数来获取用户IP地址并将其传递给$ipaddress变量
  • ...那么您可能想向我们展示该功能?我们不是在这里猜测。
  • 顺便说一句:您的问题的模棱两可已经导致人们给出不同的答案,这取决于他们是回复您的问题主题还是您的描述。保持一致!另外,问问自己是否所有背景都对你的问题是必要的。
  • @MagnusEriksson,我刚刚编辑了问题并添加了它

标签: php api ip-address


【解决方案1】:

您获得的 IP 似乎正在使用某种代理。 尝试使用 PHP explode 方法用 (,) 分割 IP,然后选择第一个。

$ips = explode(',', $ipaddress);
$theOneYouWant = $ips[0];

【讨论】:

    【解决方案2】:
    $ipaddress = explode(',', $ipaddress)[0];
    


    Explode 返回一个字符串数组,每个字符串都是通过在边界上拆分形成的字符串的子字符串……



    但请注意:在 PHP 5.4 之前,直接在函数行上选择数组条目不会 - 不能 - 工作。

    行业术语是array dereferencing

    Before PHP 5.4 you need to use the answer by @muttalebm.

    【讨论】:

    • 问题是 为什么 OP 获得两个 IP,而不是如何使用它。 (不是我的反对票。只是说)。
    • @MagnusEriksson 为什么? 我想要什么的说法不同。
    • 并不是说你的答案是错误的,但是如果你看标题,它会问为什么,因为它刚刚开始发生。在我们给 OP 一个答案之前,OP 需要首先向我们展示他们是如何获取 IP 的。
    • 有效!! @MagnusEriksson 我确实问过如何使用它,也许这不是正确的方法,但我不确定我能做些什么来解释为什么我的 ISP 给了我两个 IP
    • @staynjokede — 如果您坚持保留让他们保密的代码,我们当然无法帮助您。