设想
我在服务器上有一个小型 PHP 脚本,它会回显任何到达它的客户端的 IP 地址,以便可以通过 API 将地址添加到 cpanel MySQL 远程主机表中。我使用 IdHTTP1.Get() 传递脚本的 url 来调用此脚本。我正在通过使用 Bitdefender VPN 来测试这一点,每次运行 delphi 代码获取当前 IP 地址之前都会给我一个新的 IP 地址。PHP脚本的代码和delphi调用代码如下。
问题
如果我打开 VPN 给自己一个新的 IP 地址,然后运行代码,它会返回一个 IPv6 地址。如果我再次运行代码,而不断开 VPN,即我仍然具有相同的地址,那么在第二次调用时我会获得 IPv4 地址。随后每次运行代码时,我都会得到相同的 IPv4 地址,正如我所期望的那样。
如果我关闭 VPN 并再次打开它以获取不同的 IP 地址,则会发生同样的情况。即,我第一次运行代码时获得 IPv6 地址,随后获得 IPv4 地址
例如 第一次:2a02:2498:e000:2001:8418:7195:9f43:a0f 第二次及后续时间:88.202.181.53
这篇文章解释了两种地址格式都可能会被返回,但我得到的模式似乎非常一致。
问题
有没有办法强制代码始终返回 IPv4 地址?(我的代码无需反复询问地址,直到获得 IPv4 中的地址)
附加信息
这篇文章似乎暗示了一个解决方案,但我并没有真正理解所接受的答案足以将其应用到我的案例中。
此页面https://www.ipify.org/在 API 使用下,展示了如何使用https://api.ipify.org或https://api64.ipify.org获取我的 IPv4 或 IPv6 地址,因此应该是可以在我的脚本中说出我想要的内容
myip.php 代码
<?php
$ip=$_SERVER['REMOTE_ADDR'];
echo $ip;
?>
调用PHP脚本的Delphi函数(IdHTTP1是表单上的Indy TIdHTTP组件)
function TFrmMain.getmyipaddress: string;
var url : string;
begin
url := 'https://Thedomain.com/myip.php';
Result := '';
try
try
theip := IdHTTP1.Get(url);
Result := Trim(theip);
if result = '' then showmessage( 'Failed to get a sensible IP address from myip.php on server:');
finally
end;
except
on E: Exception do
ShowMessage('Failed to get IP address from myip.php on server:' +slinebreak +
e.Message);
end;
end;