ThinkPHP Nginx反向代理四大核心问题及配置:路由失效需正确透传PATH_INFO或rewrite;IP识别需Nginx传X-Real-IP并配置可信代理;静态资源404须独立location指向public;HTTPS识别依赖X-Forwarded-Proto与app.url自动适配。

ThinkPHP 通过 Nginx 反向代理部署时,常见问题不是“能不能转”,而是“转过去后路由失效、IP拿不准、静态资源404、HTTPS不识别”。核心在于 ThinkPHP 依赖 PATH_INFO 或 rewrite 规则解析 URL,而 Nginx 默认不透传或不拆解这部分信息。下面按实际场景分四类配置,直接可用。
基础反向代理(后端是 Swoole/Workerman)
适用于 ThinkPHP 运行在 9501、8000 等非 Nginx 直接处理 PHP 的服务上,Nginx 仅作流量入口。
- location 块必须用 proxy_pass http://127.0.0.1:9501/(末尾带 /),否则路径前缀会被重复拼接
- 务必设置:proxy_set_header Host $host、proxy_set_header X-Real-IP $remote_addr、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for、proxy_set_header X-Forwarded-Proto $scheme
- 加 proxy_redirect off,避免后端重定向返回错误 Location 地址
- 若后端需识别 HTTPS,必须靠 X-Forwarded-Proto 判断,ThinkPHP 中需开启
app.url自动适配协议
FastCGI 直连 PHP-FPM(推荐用于标准部署)
这是最常见也最稳定的方案,Nginx 直接调用本地 PHP-FPM,无需额外进程,但需精准支持 ThinkPHP 的 pathinfo 路由。
-
root 必须指向项目
public/目录,例如/var/www/myapp/public - 在
location ~ \.php$块中启用 PATH_INFO 解析:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 不能写成硬编码路径
- 搭配伪静态,用 try_files $uri $uri/ /index.php?$query_string; 替代旧式 rewrite,更安全可靠
子目录部署 + 反向代理(如 /api/ 下挂载)
当 ThinkPHP 接口需统一挂在 /api/v1/ 这类路径下,且前端不改请求地址时使用。
立即学习“PHP免费学习笔记(深入)”;
- location 配置为 location ^~ /api/,避免正则冲突
-
proxy_pass http://127.0.0.1:9501/;(注意 proxy_pass 末尾的 /)——它会自动剥离
/api/前缀再转发 - 后端 ThinkPHP 的
APP_URL应设为https://domain.com/api,并启用app.app_subpath = '/api'(v8.x)或手动调整路由基础路径 - 静态资源(如 /api/static/xxx.js)需单独 location 拦截,直接 root 到 public 目录,避免走代理
获取真实客户端 IP
默认 request()->ip() 返回的是 Nginx 本机 IP(127.0.0.1),需两步配合生效:
- Nginx 配置中必须含:proxy_set_header X-Real-IP $remote_addr; 和 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- ThinkPHP 中需在
app/middleware.php或中间件里显式设置可信代理:
'proxy_server_ip' => ['127.0.0.1'],
'proxy_server_ip_header' => ['X-Real-IP', 'X-Forwarded-For'] - 不要只信
X-Forwarded-For的第一个 IP,ThinkPHP 会自动取逗号分隔后的首项并校验合法性 - 若 Nginx 在 Docker 或云 LB 后,需把外层真实出口 IP 段加入
proxy_server_ip数组,否则会被忽略



















