服务端才能可靠获取客户端真实ip,前端无法直接获取;php中应优先用getip()等兼容代理的函数,而非仅依赖$_server['remote_addr'],并需校验x-forwarded-for中的首个合法公网ip。

纯 HTML 表单本身无法获取客户端 IP 地址——浏览器不提供该能力,form 提交时也不会自动附带 IP。真正能拿到 IP 的,只有服务端(PHP/Node.js 等)在接收请求时解析 HTTP 头或连接信息。前端能做的,只是配合后端完成传递或辅助验证。
PHP 后端用 $_SERVER['REMOTE_ADDR'] 最简但有局限
在表单提交的目标脚本(如 submit.php)里,直接读 $_SERVER['REMOTE_ADDR'] 是最快的方式:
$ip = $_SERVER['REMOTE_ADDR'];
但它只适用于:服务器**没经反向代理、CDN 或负载均衡**的场景。一旦加了 Nginx、Cloudflare、阿里云 SLB 等,这个值就变成代理节点的 IP,不是用户真实出口 IP。
- 常见错误现象:
$_SERVER['REMOTE_ADDR']固定返回127.0.0.1或某个内网段 IP(如10.10.10.10),说明请求被代理中转过 - 必须同时检查
$_SERVER['HTTP_X_FORWARDED_FOR'],它通常由代理追加,格式类似"203.205.12.45, 192.168.1.10",取最左边第一个非私有地址 - 私有地址范围包括:
127.0.0.0/8、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、::1、fd00::/8 - 别直接
explode(',', ...)[0]就用,要trim()+filter_var($ip, FILTER_VALIDATE_IP)校验合法性
前端 JS 调 API 获取公网 IP(仅作参考,不可信)
如果非要前端“显示”或“传一个 IP 字段”,可用 fetch 调用公开接口,比如:
fetch("https://api64.ipify.org?format=json")<br> .then(r => r.json())<br> .then(data => document.getElementById("ip-field").value = data.ip)<br> .catch(() => {});
但注意这 IP 是**服务端视角看到的请求源 IP**,受代理/CDN 影响,和后端拿到的 HTTP_X_FORWARDED_FOR 可能不一致;且该值可被用户手动篡改,**绝不能用于权限控制或日志归因**。
- 必须用 HTTPS 协议调用,HTTP 接口在现代浏览器中会被静默拦截
- 不要用已停服接口(如
https://jsonip.com) - 避免在
<script></script>中硬编码document.write或未处理 DOM 就执行,推荐放在DOMContentLoaded回调里 - 别依赖 WebRTC 提取局域网 IP(如
192.168.x.x)——主流浏览器已限制,返回结果不可靠
织梦(DedeCMS)自定义表单中加 IP 字段的实际写法
如果你用的是 DedeCMS,且表单提交走的是 plus/diy.php,可以直接在 PHP 层注入 IP 和时间,无需前端参与:
修改 plus/diy.php,在字段循环处理逻辑中(通常在 if($fieldinfo[1] == 'textdata') { ... } 后面)插入:
if($fieldinfo[0] == 'ip') {<br> ${$fieldinfo[0]} = GetIP();<br>}<br>if($fieldinfo[0] == 'submit_time') {<br> ${$fieldinfo[0]} = date("Y-m-d H:i:s");<br>}
然后在自定义表单模板中加两个隐藏字段:
<input type="hidden" name="ip" value=""><br><input type="hidden" name="submit_time" value="">
字段名(ip、submit_time)必须和后台自定义字段的「字段名称」完全一致,否则不会入库。
- 关键点:
GetIP()是 DedeCMS 自带函数,已做多层代理兼容,比裸写$_SERVER更稳妥 - 别漏掉数据库字段类型匹配——
ip建议用VARCHAR(45)(兼容 IPv6),submit_time用DATETIME - 修改前务必备份
diy.php,否则升级可能覆盖
真正可靠的 IP 获取永远发生在服务端,且必须结合部署架构判断可信头来源;前端传的任何 IP 都是装饰性或辅助性的,不能替代后端解析逻辑。代理链越长,X-Forwarded-For 越容易被伪造,此时需要 Nginx 配置 set_real_ip_from + real_ip_header 才能信任。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











