在 ThinkPHP 项目中,服务端直接请求 https://my.ipin.io/info 可以检测当前服务器访问外网时使用的出口 IP。这个场景适合运维诊断、代理节点检查、云服务器地区确认,而不是访客 IP 个性化。
接口说明
服务端调用检测服务器出口 IP,返回的是服务器访问外网时暴露的 IP、国家、地区和城市信息。
{"ip":"185.220.236.7","country":"TW","region":"Taiwan","city":"Taipei"}
应用场景
这些场景都能体现 IP 信息接口价值,并明确区分服务器 IP 与访客 IP。
- 检查服务器公网 IP 是否变化
- 确认 VPS、云主机或代理节点所在地区
- 在后台面板展示服务器出口 IP
- 排查 NAT、代理、CDN 后的网络出口问题
- 监控多节点服务器的出口国家和城市
实现逻辑
实现前先确认请求发起方:服务器发起请求得到服务器 IP,浏览器发起请求得到访客 IP。
- 服务端请求
https://my.ipin.io/info - 接口返回服务器出口 IP 的 JSON 信息
- 控制器把结果传给模板
- 模板显示 ip、country、region、city
- 接口失败时显示默认值
代码示例
以下代码都直接使用 https://my.ipin.io/info,注释和界面文字均已本地化。
ThinkPHP Controller
<?php
namespace app\controller;
use app\BaseController;
class IpController extends BaseController
{
public function server()
{
$default = [
'ip' => 'Unknown',
'country' => 'Unknown',
'region' => 'Unknown',
'city' => 'Unknown',
];
try {
// 服务端调用 /info:检测服务器当前出口 IP。
$json = @file_get_contents('https://my.ipin.io/info');
$data = json_decode($json, true);
$info = is_array($data) ? array_merge($default, $data) : $default;
} catch (\Throwable $e) {
$info = $default;
}
return view('server_ip', ['info' => $info]);
}
}
server_ip.html
<div class="ip-card">
<h2>服务器出口 IP 信息</h2>
<p>IP:{$info.ip|default='Unknown'}</p>
<p>Country:{$info.country|default='Unknown'}</p>
<p>Region:{$info.region|default='Unknown'}</p>
<p>City:{$info.city|default='Unknown'}</p>
</div>
SEO 与体验建议
默认内容应完整可读,地区化内容作为增强体验出现。这样搜索引擎可以抓取稳定内容,接口失败时用户也能继续使用页面。
常见错误
以下问题会影响文章准确性、代码可运行性和接口介绍可信度。
- 不要把服务端结果说成访客 IP
- 服务器诊断页面不应公开暴露
- 接口请求应设置超时
- 不要在高流量页面频繁检测
- 后台页面应增加权限控制
总结
该场景的重点是服务器出口 IP 诊断。服务端调用接口能帮助确认服务器、代理或云节点在公网中的实际 IP 信息。
常见问题
下面的问答围绕本文场景单独整理,问题和答案都与当前文章直接相关。
问题:这篇 ThinkPHP 文章检测的是谁的 IP?
答案:它检测的是服务器访问外网时使用的出口 IP,不是访客浏览器 IP。
问题:为什么服务端检测仍然有实际意义?
答案:它适合 VPS 诊断、代理节点检测、云主机地区确认和后台运维面板。
问题:这个检测页面应该公开吗?
答案:不建议公开,应放在管理员后台并增加登录与权限控制。
问题:接口请求失败会不会影响页面?
答案:示例保留默认值和异常处理,失败时不会中断页面。
问题:如果要判断访客 IP 应该怎么做?
答案:应让访客浏览器直接请求接口,而不是让服务器代为请求。