ThinkPHP部署到Apache的核心三点是:DocumentRoot必须指向public目录、启用mod_rewrite模块、对应Directory需设AllowOverride All和Require all granted;否则将导致404、白屏或源码泄露。

ThinkPHP部署到Apache服务器,核心就三点:DocumentRoot必须指向public目录、mod_rewrite模块必须启用、对应目录必须允许.htaccess覆盖重写规则。漏掉任何一项,轻则路由404,重则源码泄露。
DocumentRoot必须设为public目录
ThinkPHP 5/6/7 强制采用入口隔离设计,public是唯一合法的Web可访问路径。其他目录如app、runtime、config如果被直接暴露,攻击者可能下载数据库配置或日志文件。
- 错误做法:DocumentRoot "/var/www/myapp"(指向项目根目录)
- 正确做法:DocumentRoot "/var/www/myapp/public"
- Windows下路径含中文或空格会导致Apache启动失败,务必避免
- 不能用Alias或Redirect代替;必须在
块内显式设置
启用mod_rewrite并允许重写生效
ThinkPHP的友好URL(如/index/user/profile)依赖Apache重写引擎转发到index.php。没有它,所有带参数的路由都会返回404。
- 确认模块已加载:
httpd -M | grep rewrite应输出rewrite_module (shared) - Debian/Ubuntu执行:
a2enmod rewrite;RHEL/CentOS检查/etc/httpd/conf.modules.d/00-base.conf - 在
块中必须同时包含: AllowOverride All和Require all granted - 注意:Apache 2.4+默认是
AllowOverride None,很多Docker镜像或最小化安装也如此
虚拟主机配置示例(含安全防护)
推荐使用独立虚拟主机配置,既清晰又便于管理。以下为生产可用的最小可行配置:
立即学习“PHP免费学习笔记(深入)”;
<VirtualHost *:80>
ServerName tp.local
DocumentRoot "/var/www/myapp/public"
<Directory "/var/www/myapp/public">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<LocationMatch "^/(runtime|app|config|common|extend|vendor)/">
Require all denied
</LocationMatch>
ErrorLog "logs/tp.local-error.log"
CustomLog "logs/tp.local-access.log" combined
</VirtualHost>
-
<LocationMatch>段主动拒绝敏感目录访问,弥补潜在路径遍历风险 - 日志路径建议用绝对路径,避免Apache启动失败
- 若禁用.htaccess(推荐生产环境),需把重写规则挪进
内: <IfModule mod_rewrite.c>...</IfModule>
本地测试配套操作
开发阶段需配合系统hosts绑定域名,否则浏览器无法将请求送入Apache虚拟主机处理。
- Windows:编辑
C:\Windows\System32\drivers\etc\hosts,添加127.0.0.1 tp.local - Linux/macOS:编辑
/etc/hosts,同样添加该行 - 保存后需管理员/root权限;修改后无需重启网络,立即生效
- 验证方式:浏览器访问
http://tp.local,应显示ThinkPHP欢迎页;再试http://tp.local/index/index,确认路由正常



















