thinkphp在apache上跑不起来的根本原因是三项配置缺失:documentroot未指向public目录、mod_rewrite模块未启用、directory块中未设置allowoverride all和require all granted;必须全部满足才能保障路由、静态资源及接口正常访问。

ThinkPHP 在 Apache 上跑不起来,基本就三件事没做对:入口目录设错、重写模块没开、目录权限没放行。只要这三项到位,路由、静态资源、后台接口全都能正常访问。
DocumentRoot 必须指向 public 目录
ThinkPHP 5/6/7/8 强制要求 Web 入口与源码分离。public 是唯一允许被浏览器直接访问的目录,其余如 app、config、runtime 都不能暴露在外。
- ❌ 错误写法:
DocumentRoot "/var/www/myapp"—— 可能导致config/database.php被下载 - ✅ 正确写法:
DocumentRoot "/var/www/myapp/public" - Windows 下路径含中文或空格会启动失败,建议用纯英文路径,例如
D:/www/myapp/public
启用 mod_rewrite 并确认加载成功
URL 重写是 ThinkPHP 友好路由(比如 /user/profile)的基础。没有它,所有非 index.php 的请求都会返回 404。
- 运行命令检查:
httpd -M | grep rewrite,应看到rewrite_module (shared) - Debian/Ubuntu:执行
a2enmod rewrite后重启 Apache - RHEL/CentOS:确认
/etc/httpd/conf.modules.d/00-base.conf中已取消LoadModule rewrite_module modules/mod_rewrite.so的注释
Directory 块里必须配全两项关键指令
即使重写模块开了,如果目录配置不完整,.htaccess 文件也不会生效,或者直接返回 403 禁止访问。
-
AllowOverride All—— 允许 public 目录下的 .htaccess 覆盖重写规则 -
Require all granted—— Apache 2.4+ 必须项,替代旧版的Order allow,deny+Allow from all - 这两行必须放在对应
<directory></directory>块内,不能漏也不能写错位置
验证配置是否生效
改完配置别急着重启,先做两步安全检查:
- 执行
apachectl -t确认语法无误 - 执行
apachectl restart重启服务 - 浏览器访问
http://your-domain/,应显示 ThinkPHP 欢迎页 - 再试一个带参数的路由,比如
http://your-domain/index/index/index,能正常响应即说明重写成功
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











