ThinkPHP在Docker中路由失效,主因是Nginx未正确传递PATH_INFO给PHP-FPM;必须配置fastcgi_split_path_info ^(.+.php)(/.+)$;和fastcgi_param PATH_INFO $fastcgi_path_info;,且root须指向public目录、SCRIPT_FILENAME用绝对路径。

ThinkPHP 在 Docker 容器中跑不起来路由,八成是 Nginx 没配对伪静态——不是加个 try_files 就完事,关键得把 PATH_INFO 正确传给 PHP-FPM,否则 $_SERVER['PATH_INFO'] 为空,Route::rule() 全部失效。
必须启用 fastcgi_split_path_info 并透传 PATH_INFO
Nginx 默认不解析 /index.php/user/list 这类 URL 中的路径部分。ThinkPHP 依赖 PATH_INFO 提取路由参数,所以配置里这两行缺一不可:
fastcgi_split_path_info ^(.+\.php)(/.+)$;fastcgi_param PATH_INFO $fastcgi_path_info;
注意正则末尾用 /.+(非空路径),不能写成 /* 或 /.*,否则可能匹配失败或截断错误。
root 必须指向 public 目录,SCRIPT_FILENAME 要绝对路径
ThinkPHP 8 强制入口统一为 public/index.php,Nginx 的 root 必须设为项目 public 上级目录,并在 location ~ \.php$ 块中明确指定脚本路径:
立即学习“PHP免费学习笔记(深入)”;
-
root /var/www;(假设代码挂载在/var/www) -
fastcgi_param SCRIPT_FILENAME /var/www/public/index.php;(不能写成$document_root/index.php,避免因 location 匹配偏差导致路径错乱)
推荐用 try_files 替代 rewrite,更稳定
旧式 rewrite ^(.*)$ /index.php?s=$1 last; 在容器环境容易因 root 或 alias 设置出错。直接用:
-
try_files $uri $uri/ /public/index.php?$query_string;(若 root 已设为/var/www) - 或更通用:
try_files $uri $uri/ /index.php?$query_string;(前提是index.php在 root 下可访问)
该写法不依赖重写模块,兼容性好,也避免了 .htaccess 在 Nginx 中完全无效的问题。
挂载配置要可靠,别靠临时修改
在 Docker 或 Kubernetes 中,Nginx 配置不能靠 exec 进去改文件——Pod 重建就丢。正确做法是:
- 把完整 server 块写进自定义
default.conf,内容包含上述所有关键指令 - 通过 volume 挂载到容器内
/etc/nginx/conf.d/default.conf(不要覆盖整个/etc/nginx/) - 确保挂载后权限可读:
ls -l /etc/nginx/conf.d/显示 Nginx 主进程用户(如nginx或www-data)有读权限



















