ThinkPHP部署Apache后404主因是伪静态未生效,需依次启用mod_rewrite模块、设置AllowOverride All、配置正确.htaccess规则(推荐index.php?s=$1),并根据PHP运行模式调整cgi.fix_pathinfo参数为1。

ThinkPHP新手部署到Apache服务器后,访问 http://domain/index/index 直接返回404,而带 index.php 的地址如 http://domain/index.php/index/index 却能正常打开——这说明框架本身运行无误,但URL重写规则完全没被Apache读取或执行,问题卡在服务器配置层而非代码逻辑。
确认mod_rewrite模块已启用
Apache默认不加载rewrite模块,哪怕.htaccess写得再标准也毫无作用。登录服务器终端,执行:a2enmod rewrite
执行后必须重启Apache服务,仅重载配置(reload)无法激活新模块:systemctl restart apache2
验证是否真正生效:运行 apache2ctl -M | grep rewrite,输出中必须出现 rewrite_module (shared)。若显示为空,说明模块未加载成功,需检查 /etc/apache2/mods-available/rewrite.load 文件是否存在且未被注释。
立即学习“PHP免费学习笔记(深入)”;
修改站点目录权限配置 AllowOverride
进入宝塔面板 → 找到对应站点 → 「配置文件」→ 定位到 <Directory "/www/wwwroot/your-domain.com"> 区块(路径以你实际项目为准)。
将其中的 AllowOverride None 改为 AllowOverride All;若该区块不存在,必须手动添加完整结构,否则Apache启动会报错:
<Directory "/www/wwwroot/your-domain.com"><br> AllowOverride All<br> Require all granted<br></Directory>
【改完必须重启Apache】,AllowOverride 不支持热重载,reload无效。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
修正.htaccess重写规则适配运行模式
ThinkPHP不同版本、不同PHP运行模式(CGI/FastCGI/PHP-FPM)对PATH_INFO的依赖程度不同。常见错误是直接复制官方默认规则却忽略环境差异。
方法一:适用于PHP-FPM或传统CGI模式(推荐优先尝试)
编辑项目根目录(通常是public)下的 .htaccess,确保内容为:
<IfModule mod_rewrite.c><br> Options +FollowSymlinks -Multiviews<br> RewriteEngine On<br> RewriteCond %{REQUEST_FILENAME} !-d<br> RewriteCond %{REQUEST_FILENAME} !-f<br> RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]<br></IfModule>
方法二:仅当确认服务器支持PATH_INFO且未启用PHP-FPM时使用
将最后一行改为:RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]。但若PHP版本≥8.0且 cgi.fix_pathinfo=0(默认值),此写法必然触发 No input file specified 错误。
方法三:强制兼容型兜底写法(调试阶段可用)
先在 .htaccess 里写一行最简跳转:RewriteRule ^test$ /index.php [R=302,L],访问 /test 看是否跳转。能跳转说明规则已生效,再逐步替换为完整路由规则。
验证PHP运行模式并调整参数
在项目中新建一个 phpinfo.php 文件,内容为 <?php phpinfo(); ?>,访问该页面,搜索 Server API 项:
若显示为 FPM/FastCGI,则必须使用方法一的 index.php?s=$1 写法;
若显示为 apache2handler,可尝试方法二,但需同步检查 php.ini 中 cgi.fix_pathinfo 是否为 1。
在宝塔面板中打开PHP设置 → 「配置修改」→ 搜索 cgi.fix_pathinfo,将其设为 1 并保存,然后重启PHP服务。此参数为ThinkPHP解析 index.php/模块/控制器 类路径的关键前提。


















