用途:在 Phoenix 1.8 应用中加入 ClientIP 模块与 Plug,从反向代理/负载均衡器转发的请求头中解析出真实客户端 IP。当应用运行在 Fly.io、Cloudflare、Nginx 等代理之后时,conn.remote_ip 返回的是代理地址,本模块用于还原真实来源 IP,可用于限流、地理查询、审计日志等。
主要能力:按配置的优先级依次检查转发头(默认 fly-client-ip、cf-connecting-ip、x-real-ip、x-forwarded-for),首个有效结果即返回;对 x-forwarded-for 从右向左遍历,跳过位于可信代理 CIDR 范围内的 IP,以防伪造;无转发头时回退到 conn.remote_ip;支持 IPv4/IPv6;仅依赖 OTP 的 :inet 与 Plug.Conn,无外部依赖。
生成内容:lib/<app>_web/client_ip.ex 核心模块(resolve/1 返回 IP 元组,to_string/1 转为可读字符串)、lib/<app>_web/plugs/client_ip.ex 的 Plug(向 conn.assigns 写入 :client_ip 与 :client_ip_string)、config/config.exs 默认配置,以及可选的 config/runtime.exs 运行时可信代理配置(通过 TRUSTED_PROXY_CIDRS 环境变量)。
使用方式:在代码库检测应用模块前缀、OTP 应用名、Web 模块前缀与部署目标(fly.toml、render.yaml 等)后,将 Plug 加入 router.ex 的 browser 与 api 流水线,位置在标准 Phoenix 插件之后、认证插件之前。控制器与 LiveView 可通过 conn.assigns.client_ip_string 读取;也可不经 Plug 直接调用 ClientIP.resolve/1。需要 WebSocket 连接后的 IP 时,可在 endpoint 配置 connect_info: [:peer_data, :x_headers]。完成后用 mix compile --warnings-as-errors 与 mix test 验证。
限制:生成前需审计是否已存在 remote_ip 包或自定义 IP 处理,已有则跳过相应部分;头优先级与可信代理列表需按部署目标调整(如 Fly.io 用 fly-client-ip,Cloudflare 用 cf-connecting-ip,AWS ALB 用 x-forwarded-for),否则结果可能不准。其余平台支持与效果资料未提供。