ThinkPHP上线后404是因服务器未正确转发请求至index.php:Apache需启用mod_rewrite、AllowOverride设为FileInfo/All、.htaccess置于public目录并按规范书写;Nginx需配置location重写规则、运行目录设为/public、禁用putenv/ini_set、SCRIPT_FILENAME用$realpath_root。

ThinkPHP项目上线后访问路由地址直接返回404,不是代码写错了,而是服务器没把请求正确转给index.php——Apache的.htaccess被忽略、Nginx的rewrite位置放错、TP6/8入口路径写成/index.php却忘了public目录,这些坑踩一个就全站瘫痪。
Apache环境:.htaccess生效前必须确认三件事
第一步:用phpinfo()页面检查mod_rewrite是否已加载,没加载就白配;【AllowOverride必须包含FileInfo或All,设为None时.htaccess所有规则完全失效】。
第二步:确认项目入口文件index.php所在目录(通常是public)下能新建.htaccess文件,且Web服务器有读取权限。
第三步:在public目录下创建.htaccess,内容严格按以下格式写,开头结尾不能多空行、不能用中文标点:
立即学习“PHP免费学习笔记(深入)”;
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
Nginx环境:TP6/8必须用/public/index.php,且规则位置卡死
方法一:宝塔用户直接改配置文件(最稳)
进入宝塔 → 网站 → 设置 → 配置文件,在server块内、location ~ \.php$这一行之前插入以下完整块:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /public/index.php?s= last;
}
}
注意:last不可替换为break,否则重写后不再重新匹配location,请求直接进静态文件处理流程,返回404。
方法二:手动编辑nginx.conf(适合运维人员)
在server块中找到location / { },把里面原有内容删掉,替换成:
location / {
try_files $uri $uri/ /public/index.php?$query_string;
}
这一步做完后,必须立刻检查PHP处理块里有没有这行:fastcgi_param PATH_INFO $fastcgi_path_info;,没有就手动加在fastcgi_split_path_info指令后面。
关键三项硬配置,缺一不可
① 运行目录必须设为/public:宝塔 → 网站 → 设置 → 网站目录 → 运行目录 → 选择/public(留空或填/都错)。
② PHP禁用函数列表里,putenv和ini_set两项绝对不能勾选——TP6/8启动时靠它们动态注入PATH_INFO环境变量,勾了就报“URL pathinfo not supported”。
③ Nginx配置中fastcgi_param SCRIPT_FILENAME必须用$realpath_root而非$document_root,否则runtime目录写入失败,日志报“Permission denied”。



















