要让FrankenPHP在Nginx反向代理后正确获取真实客户端IP,关键在于Nginx显式设置proxy_set_header传递X-Forwarded-For等头,并在FrankenPHP中通过--trusted-proxies指定可信代理IP段(如127.0.0.1),使其解析X-Forwarded-For并覆盖$_SERVER['REMOTE_ADDR']。

要让 FrankenPHP 在 Nginx 反向代理后正确获取真实客户端 IP,关键在于 Nginx 正确传递原始 IP,并在 PHP 应用中信任并解析对应 HTTP 头字段。
确保 Nginx 传递 X-Forwarded-For 和其他可信头
Nginx 作为反向代理时,默认不会自动转发客户端真实 IP。你需要显式设置 proxy_set_header,将原始请求的 IP 写入标准代理头:
- 在 Nginx 的 location 块或 upstream 配置中添加:
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
若 Nginx 前还有 CDN 或多层代理(如 Cloudflare),需改用 $http_x_forwarded_for 拼接,但前提是只有一层可信代理时,直接用 $remote_addr 更安全、更可靠。
配置 FrankenPHP 信任代理 IP 段
FrankenPHP 默认不信任任何代理头,必须显式声明哪些 IP 是可信的反向代理(如 Nginx 所在服务器),否则 $_SERVER['REMOTE_ADDR'] 仍会是代理地址(如 127.0.0.1)。
立即学习“PHP免费学习笔记(深入)”;
- 在 FrankenPHP 启动参数中加入:
--trusted-proxies=127.0.0.1,::1(本地 Nginx) - 如果 Nginx 运行在 Docker 容器内且与 FrankenPHP 分离,填其容器网段(如
172.20.0.0/16) - 也可通过环境变量设置:
FRANKENPHP_TRUSTED_PROXIES=127.0.0.1,::1
设置后,FrankenPHP 会自动解析 X-Forwarded-For 并将最左边的非代理 IP 赋给 $_SERVER['REMOTE_ADDR'],同时保留原始头供业务逻辑读取。
验证与调试方法
部署后建议快速验证是否生效:
- 在 PHP 中临时输出:
var_dump($_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_X_FORWARDED_FOR'] ?? 'not set'); - 用 curl 模拟请求:
curl -H "X-Forwarded-For: 203.0.113.42" http://your-site/,观察返回值是否为 203.0.113.42 - 检查 Nginx access log 是否记录了真实 IP(需配置
log_format包含$http_x_forwarded_for)
注意:若 REMOTE_ADDR 仍是 127.0.0.1,大概率是 --trusted-proxies 未生效或 IP 段配置错误。
安全提醒:避免伪造 IP 被利用
信任代理配置不当会导致客户端随意伪造 X-Forwarded-For,造成 IP 欺骗。务必做到:
- 仅将实际运行 Nginx 的 IP 或网段加入
--trusted-proxies - 禁止公网直接访问 FrankenPHP 实例(应只监听 127.0.0.1 或内网地址)
- 不在 Nginx 中无条件透传客户端提交的
X-Forwarded-For;推荐始终用$remote_addr覆盖,除非你明确需要多级链路追踪



















