webman 在 nginx 代理后 $request->getremoteip() 返回 127.0.0.1 是因底层读取 $_server['remote_addr'](即 nginx 的连接源 ip),需配置 proxy_set_header x-real-ip $remote_addr 并改用 $request->header('x-real-ip') 或 $request->getrealip() 获取真实客户端 ip。

Webman 在 Nginx 代理后默认拿到的 $request->getRemoteIp() 是 127.0.0.1 或内网地址,不是用户真实 IP —— 这不是 bug,是反向代理的标准行为。必须显式配置 Nginx 并改用可信 header 读取。
为什么 $request->getRemoteIp() 总是 127.0.0.1
Webman 的 $request->getRemoteIp() 底层直接读 $_SERVER['REMOTE_ADDR'],而 Nginx 作为反向代理时,TCP 连接发起方是 Nginx 自己,所以 REMOTE_ADDR 永远是 Nginx 的出口 IP(如 127.0.0.1)。它不解析任何 HTTP header,也不做代理链判断。
常见错误现象:
- 本地开发用
php webman start直连,getRemoteIp()正常;一上生产 Nginx,全变成127.0.0.1 - 日志里所有访问都显示同一个内网 IP,无法做地域统计或风控
Nginx 必须设置 proxy_set_header X-Real-IP $remote_addr
这是最轻量、最可控的透传方式。Nginx 把它认为的“真实客户端 IP”(即建立 TCP 连接的原始地址)写进 X-Real-IP header,Webman 只需读这个 header 即可 —— 它不可被客户端伪造,因为 Nginx 不会接受外部传入的同名 header(除非你主动配了 underscores_in_headers on 且没禁用)。
你的 Nginx location 块里必须有:
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host;
注意:$remote_addr 是 Nginx 收到请求时的 socket 源 IP,只要 Nginx 和 Webman 在同一台机器或可信内网,它就是真实的。不要用 $http_x_real_ip 或其它变量替代。
Webman 中正确读取真实 IP 的两种方式
Webman v1.5.7+ 内置了安全的 IP 解析逻辑,但前提是 Nginx 配置到位。推荐以下任一方式:
- 用
$request->header('X-Real-IP'):最直接,返回字符串,需手动校验是否为合法 IPv4/IPv6(例如用filter_var($ip, FILTER_VALIDATE_IP)) - 用
$request->getRealIp():内部已做基础过滤,会跳过空值、私有地址(如127.0.0.1、10.0.0.0/8),但**不会校验来源是否可信代理**—— 所以你仍要确保 Nginx 是唯一能设X-Real-IP的入口
示例代码:
$ip = $request->header('X-Real-IP');
if (!$ip || !filter_var($ip, FILTER_VALIDATE_IP)) {
$ip = '0.0.0.0'; // 或抛异常、记录告警
}
别再用 $request->getRemoteIp() 做业务判断,它在代理场景下毫无意义。
不要依赖 HTTP_X_FORWARDED_FOR 做关键逻辑
$_SERVER['HTTP_X_FORWARDED_FOR'] 是逗号分隔的字符串,格式如 "203.0.113.195, 198.51.100.100",最左边那个理论上是用户真实 IP —— 但前提是整个代理链都可信。现实中,CDN、WAF、甚至恶意请求都能随意加这个 header。
如果你真要用它,必须配合白名单校验:
- 先检查
$_SERVER['REMOTE_ADDR']是否在你信任的代理列表里(比如['127.0.0.1', '10.10.0.0/16']) - 只在匹配时才解析
HTTP_X_FORWARDED_FOR,取第一个非私有 IP - 永远不把它用于登录限流、封禁、计费等强安全场景
对 Webman 来说,X-Real-IP + 正确 Nginx 配置,已经覆盖 99% 的生产需求。多一层代理、多一个 header,就多一分被绕过的可能。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











