ThinkPHP在Apache下跑不起来通常因mod_rewrite未启用或AllowOverride未设为All:需确认httpd -M | grep rewrite输出rewrite_module (shared),并在VirtualHost的Directory块中配置AllowOverride All和Require all granted,DocumentRoot必须指向public目录,重写规则应置于IfModule mod_rewrite.c内并含RewriteCond %{REQUEST_FILENAME} !-f。

ThinkPHP 在 Apache 下跑不起来,通常不是框架问题,而是 Apache 没正确处理 index.php 入口和 URL 重写。默认配置下,直接访问 /user/login 这类路径会 404,因为 Apache 不知道该转发给 index.php。
Apache 必须启用 mod_rewrite 并允许 .htaccess 覆盖
ThinkPHP 的 .htaccess 文件依赖 mod_rewrite 和目录级重写权限。没开这两项,重写规则根本不会执行。
- 确认模块已加载:
httpd -M | grep rewrite,输出应含rewrite_module (shared) - 在
VirtualHost或主配置的<directory></directory>块中,必须设:AllowOverride All(不能是None) - 若用的是 Apache 2.4+,还需加:
Require all granted,否则即使规则匹配也会被 403 拦截
DocumentRoot 应指向 public 目录,不是项目根目录
ThinkPHP 6+ 强制要求 Web 入口与源码分离。public/ 是唯一可被 Web 访问的目录,其余如 app/、config/ 必须对外不可达。
- 错误做法:
DocumentRoot "/var/www/myapp"→ 会导致config/database.php可能被直接下载 - 正确做法:
DocumentRoot "/var/www/myapp/public" - 同时确保
<directory></directory>块内有AllowOverride All和Require all granted
不用 .htaccess 时,重写规则要写进 VirtualHost
生产环境常禁用 .htaccess(性能+安全),这时需把 ThinkPHP 提供的重写逻辑手动挪到 Apache 配置里。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
在 <virtualhost></virtualhost> 内直接写:
立即学习“PHP免费学习笔记(深入)”;
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
-
RewriteCond %{REQUEST_FILENAME} !-f是关键:只对真实不存在的文件/目录才重写,避免静态资源(.js、.css)也被转给 PHP -
[PT]表示 pass-through,确保后续Alias或ProxyPass规则还能生效;漏掉它可能导致 FastCGI 通信异常 - 别用
[L]后加其他重写——它会终止当前轮次,后续规则全失效
PATH_INFO 支持在 Apache 2.4.38+ 有兼容性坑
ThinkPHP 默认用 PATH_INFO 模式解析路由(如 index.php/user/index),但 Apache 2.4.38+ 对 AcceptPathInfo 的默认行为变了,部分版本会丢弃 PATH_INFO。
- 显式开启:
AcceptPathInfo On(加在<directory></directory>或<virtualhost></virtualhost>内) - 若仍无效,改用
FastCGI显式传参:在php-fpm.conf或 ApacheSetHandler段中补上php_value cgi.fix_pathinfo=1 - 更稳妥的做法:在
config/app.php中把'url_route_on' => true和'url_common_param' => false配好,避免过度依赖 PATH_INFO
public/.htaccess 只是开发便利手段,上线前务必验证配置是否脱离它仍能跑通。最容易被忽略的是 AllowOverride All 和 Require all granted 的组合缺失——它们不报错,但会让所有重写静默失效。


















