ThinkPHP 8.0在Ubuntu 20.04 Apache下伪静态需四者协同:启用mod_rewrite模块、AllowOverride All放开目录权限、.htaccess置于public目录并含正确规则(含PT标志)、框架配置url_route_on=true且pathinfo_depr='/',缺一导致404或跳回index.php。

在 Ubuntu 20.04 上启用 Apache 2.4 的 mod_rewrite 并让 ThinkPHP 8.0 伪静态正常工作,关键不是只开模块,而是“模块启用 + 目录权限放开 + .htaccess 正确放置 + 框架配置匹配”四者缺一不可。漏掉任一环,都会出现 404、跳回 index.php 或白屏。
确认并启用 mod_rewrite 模块
Ubuntu 20.04 默认可能未启用该模块。执行以下命令:
-
sudo a2enmod rewrite(启用模块) -
sudo systemctl restart apache2(重启生效) - 验证是否加载成功:
apache2ctl -M | grep rewrite,应输出rewrite_module (shared)
修改站点配置,允许 .htaccess 覆盖规则
仅启用模块还不够——Apache 默认禁止 .htaccess 生效。需编辑你的站点配置文件(如 /etc/apache2/sites-available/000-default.conf 或对应域名的 conf 文件),在 <virtualhost></virtualhost> 内的 <directory></directory>(或你项目实际路径)区块中,确保包含:
-
AllowOverride All(不能是None或FileInfo——ThinkPHP 需要重写+环境控制,All最稳妥) -
Require all granted(替代旧版Order allow,deny+Allow from all)
改完保存,执行 sudo systemctl reload apache2。
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
把 .htaccess 放对位置并写对内容
ThinkPHP 8.0 入口文件 index.php 必须在 public/ 目录下,.htaccess 也必须放在同一级(即 public/.htaccess),不能放错到项目根目录。
文件内容应为(注意大小写和空格):
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
-
PT(PassThrough)标志必须保留,否则 Apache 不会把路径信息正确传给 PHP,TP8 就无法解析/index/hello - 若项目部署在子目录(如
http://site.com/myapp/),需加一行:RewriteBase /myapp/ - 用
ls -la public/.htaccess确认文件名无误(不是.htaccess.txt)
检查 ThinkPHP 8.0 框架配置
光服务器配对没用,框架也得“配合演出”。打开 config/app.php,确认以下两项:
-
'url_route_on' => true,(路由必须开启) -
'pathinfo_depr' => '/',(分隔符与 .htaccess 中的index.php/$1一致) - 无需设置
url_rewrite_on(TP8 已移除此配置项,它由服务器层决定)
多应用模式下,再核对 domain_bind 是否与访问域名完全一致(含 www 和端口)。
验证是否真正生效
别只看首页能打开——按顺序验证:
- 访问
http://yourdomain.com/index.php/index/hello→ 应正常显示(测试 PHP 和基础路由) - 再访问
http://yourdomain.com/index/hello→ 应同样显示,且地址栏不跳转、不带index.php(这才是伪静态成功) - 查看 Apache 错误日志:
sudo tail -f /var/log/apache2/error.log,搜索rewrite或not found排查拦截问题


















