小程序请求的真实ip是微信服务器透传的x-wx-real-ip头,需https+业务域名配置才有效;php应仅信任该头,禁用remote_addr和x-forwarded-for。

小程序发起请求时,IP 是谁的?
小程序本身不直接暴露用户真实 IP,所有网络请求都经过微信服务器中转。你后端收到的 REMOTE_ADDR 通常是微信服务器的出口 IP(比如 127.0.0.1 或腾讯云某段内网地址),不是用户手机或 WiFi 的真实出口 IP。
真正能拿到用户侧 IP 的唯一可靠方式,是微信在 **HTTP 请求头** 中透传的 X-WX-Real-IP 字段 —— 这个字段只在微信服务器转发请求到你的 PHP 后端时携带,且仅限于合法配置了「业务域名」并启用 HTTPS 的小程序。
- 必须使用 HTTPS 协议,HTTP 域名不会携带该头
- 域名需在小程序后台「开发管理 → 业务域名」中正确配置并校验通过
- 该头不可伪造,由微信网关写入,可信度高
PHP 中如何安全读取 X-WX-Real-IP
不能直接信任所有来源的 X-Forwarded-For 或 X-Real-IP,必须限定只取微信官方头。PHP 获取方式如下:
// 推荐:只取微信透传头,忽略其他代理头
$ip = $_SERVER['HTTP_X_WX_REAL_IP'] ?? null;
<p>// 额外校验(可选):确保是合法 IPv4/IPv6 格式
if ($ip && filter_var($ip, FILTER_VALIDATE_IP)) {
// 使用 $ip
}- 不要用
$_SERVER['REMOTE_ADDR']—— 它是 Nginx/Apache 接收连接的地址,通常是反向代理或负载均衡器 IP - 避免组合
X-Forwarded-For多级 IP 列表 —— 小程序请求不走通用代理链,这个头可能为空、缺失或被污染 - 如果用了 Nginx,确认未在配置中覆盖或清空
X-WX-Real-IP(例如没写proxy_set_header X-WX-Real-IP "";)
为什么有些环境拿不到 X-WX-Real-IP?
常见失效场景和对应检查点:
婚纱影楼小程序提供了一个连接用户与影楼的平台,相当于影楼在微信的官网。它能帮助影楼展示拍摄实力,记录访客数据,宣传优惠活动。使用频率高,方便传播,是影楼在微信端宣传营销的得力助手。功能特点:样片页是影楼展示优秀摄影样片提供给用户欣赏并且吸引客户的。套系页是影楼根据市场需求推出的不同套餐,用户可以按照自己的喜好预定套系。个人中心可以查看用户预约的拍摄计划,也可以获取到影楼的联系方式。
立即学习“PHP免费学习笔记(深入)”;
- 小程序前端调用的是
http://接口 —— 微信强制拦截,拒绝转发,且不带任何真实 IP 头 - 域名未在小程序后台「业务域名」中添加,或添加后未点击「配置」完成校验(需上传校验文件)
- 后端部署在本地开发环境(如
localhost或127.0.0.1)—— 微信不支持调试域名透传此头 - 使用了云开发 CloudBase,其 HTTP 触发器默认不透传
X-WX-Real-IP,需改用云函数 +openapi方式获取用户信息(此时 IP 不可用,只能靠cloud.getWXContext()拿openid等)
跨平台兼容性注意点
如果你的 PHP 接口同时服务小程序、公众号 H5、APP 等多端,IP 获取逻辑要分路径处理:
- 小程序请求:优先取
$_SERVER['HTTP_X_WX_REAL_IP'] - 公众号 JSAPI 请求:通常走微信浏览器,
REMOTE_ADDR可能是用户真实出口 IP(但不稳定),更稳妥是结合signature+jsapi_ticket校验后再查用户基本信息(含地区,但不含 IP) - APP 直连或 H5 直连:可考虑
X-Forwarded-For(需确保反向代理配置可信)或REMOTE_ADDR(若无代理)
别试图用一套逻辑“自动识别”来源再选 IP —— 微信头只在小程序合法 HTTPS 请求中存在,其它场景不会出现,强行 fallback 容易引入伪造风险。
真实 IP 在多数合规场景下并非必需;如果用于风控或限流,建议以 openid + 设备指纹(如 unionid + systemInfo.model 组合)为主,IP 仅作辅助参考。微信对用户隐私控制严格,不提供精确地理位置或运营商出口 IP。










