开发环境能跑通的伪静态规则上线后404,主因是apache/nginx配置权限、path_info传递方式、框架路由模式三处不一致:apache生产环境常禁用allowoverride导致.htaccess失效;nginx生产环境应弃用if改用try_files兜底;tp6生产需检查putenv/ini_set是否被php禁用,并确认url_route_on开启及route.php非空。

开发环境能跑通的伪静态规则,上线到生产环境大概率 404——不是规则写错了,而是开发和生产在 Apache/Nginx 配置权限、PATH_INFO 传递方式、框架路由模式三处天然不对齐。
Apache 开发用 .htaccess,生产虚拟主机可能根本不读它
本地 XAMPP/WAMP 默认允许 .htaccess,但绝大多数共享型 Apache 虚拟主机(如阿里云万网、腾讯云轻量默认 Apache)把 AllowOverride 设为 None,哪怕你放了文件也完全忽略。
- 先确认控制面板(如宝塔、cPanel)是否开放「重写规则」入口,优先在那里粘贴规则,比依赖
.htaccess更可靠 - 如果只能靠
.htaccess,必须联系客服确认已开启FileInfo Options级权限,AllowOverride All不是标配 -
.htaccess必须放在public/目录(TP6)或index.php同级目录(TP5),不是项目根目录;子目录部署时漏掉RewriteBase /subdir/就会全部 404
Nginx 生产环境不支持 if 判断,但开发常用 if(!-e) 写法
本地 Nginx 开发常写 if (!-e $request_filename) { rewrite ... },但在 CentOS 7+、Nginx 1.20+ 的生产环境里,这种写法容易触发 rewrite or internal redirection cycle 错误,且和 fastcgi_split_path_info 冲突导致 PATH_INFO 解析失败。
- 生产推荐用
try_files $uri $uri/ /index.php?$query_string;,无条件兜底,不依赖判断顺序 - 必须确保
root指向的是public/目录,不是整个项目目录;否则/index.php找不到 - 宝塔面板选「ThinkPHP」模板默认是
if写法,上线前务必手动替换成try_files并测试
TP6 开发默认走 PATH_INFO,生产 Nginx 可能禁用 putenv/ini_set
TP6 启动时会在 public/index.php 开头动态设置 $_SERVER['PATH_INFO'],依赖 putenv 和 ini_set 函数。但很多生产虚拟主机(尤其国外共享主机)在 PHP 禁用函数列表里默认勾选了这两个。
- 报
URL pathinfo not supported或所有路由 404,第一反应不是改 Nginx,而是查 PHP 禁用函数 - 若无法开启
putenv,退而求其次:在config/app.php中设'url_common_param' => true,改用?s=/index/index模式,并配 Nginx 规则try_files $uri $uri/ /index.php?s=$uri&$args; - 同时确认
pathinfo_depr配置(如'/')和重写规则中的分隔符(index.php/$1)严格一致,否则user-123这种用-分隔的路由直接失效
路由开关和严格模式在生产环境容易被忽略
开发时可能开着 url_route_must => false 兜底,但生产环境一旦打开 'url_route_must' => true,没在 route.php 里显式注册的路径就全 404,连首页都打不开。
- 检查
config/app.php中'url_route_on' => true是否开启,关了就等于废掉所有伪静态 - TP6 的
route/目录下不能是空文件,至少要有return [];,否则路由系统初始化失败 - 开发用的调试路由(如
Route::get('test', function(){}))没加进生产route.php,上线后对应 URL 就会 404
最常被跳过的点:生产环境的 runtime/ 目录权限不是 755 就够,关键是 Nginx 和 PHP-FPM 进程用户必须同组,否则日志写不进 runtime/log/,错误信息看不到,排查卡死在“为什么没报错却 404”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











