TP6接口Linux部署返回404主因是Web服务器未正确转发请求至index.php。需检查Nginx的try_files配置、public为根目录、路由是否注册及缓存清理、大小写统一等。

TP6 接口在 Linux 部署后返回 404,绝大多数情况不是代码写错了,而是请求根本没进到 ThinkPHP 框架里——Nginx 或 Apache 在 PHP 执行前就直接返回了原生 404。核心要分清:是 Web 服务器拦截了请求,还是框架路由没匹配上。
检查 Nginx 是否正确转发到 index.php
这是最常见原因。TP6 默认使用 PathInfo 模式(如 /index.php/api/user),但 Nginx 默认不识别这种路径,会当成真实文件去查,查不到就 404。
- 确认
server块中location /内有这行:try_files $uri $uri/ /index.php?$query_string; - 若用了
fastcgi_split_path_info,必须配对设置:fastcgi_param PATH_INFO $fastcgi_path_info;,否则$_SERVER['PATH_INFO']为空,TP6 解析不了路由段 - 避免写成
try_files $uri /index.php?$args;——$args不包含 PathInfo,会导致s=/api/user形式也失效
确认 public 目录为 Web 根目录且权限正确
宝塔或手动配置时,root 必须指向项目 public 目录(不是项目根目录),且该目录对 Nginx 运行用户(如 www 或 nginx)可读。
- 错误示例:
root /www/wwwroot/mytp6;→ 应改为root /www/wwwroot/mytp6/public; - 执行命令检查:
ls -ld /www/wwwroot/mytp6/public,确保权限至少为drwxr-xr-x - 若用宝塔,站点根目录设置页里“网站目录”必须选中 public 文件夹
排除框架层路由未加载或缓存问题
能访问首页但接口 404,可能是路由没注册成功,或缓存没刷新。
- 运行命令查看实际加载的路由:
php think route:list,确认你的接口路由(如api/user)是否在列表中 - APP_DEBUG = false 时,路由会被缓存到
runtime/route/;改了路由文件不生效?直接删掉整个runtime/route/目录 - 多应用模式下,路由文件路径应为
app/your_app_name/route/app.php,不是app/route/app.php - 检查路由文件开头是否有
use think\facade\Route;,缺这句会导致路由注册失败
注意大小写敏感引发的静态资源 404
接口本身通了,但前端调用时因 URL 大小写不一致(如请求 /api/User 而路由定义为 /api/user)被 Nginx 直接拒掉,或上传的 JS/CSS 文件名大小写与引用不一致,在 Linux 下就会 404。
- 统一约定:所有路由定义、前端请求 URL、静态资源引用全部使用小写
- Nginx 不支持自动忽略大小写,不要依赖“它应该能自己匹配”
- 上传文件处理逻辑中,禁用
pathinfo()二次解析原始名;保存物理文件用$_FILES['file']['name']原值,存数据库建议转小写标准化


















