伪静态生效需三者协同:Apache启用mod_rewrite模块、.htaccess置于public目录并含RewriteCond与PT标志规则、ThinkPHP开启路由配置;缺一即404。

伪静态在 ThinkPHP 中不是框架自己“生成”静态文件,而是靠服务器把请求重写到 index.php,再由框架解析路由。能不能生效,关键看三件事:Apache 的 mod_rewrite 是否启用、.htaccess 文件是否放对位置且权限正确、ThinkPHP 路由是否已开启。缺一不可。
Apache 必须启用 mod_rewrite 并允许 .htaccess 覆盖
很多新手卡在这一步,以为写了 .htaccess 就能用,结果 404 或直接显示目录列表。
- Linux 下执行
sudo a2enmod rewrite启用模块,然后sudo systemctl restart apache2 - 检查虚拟主机配置(如
/etc/apache2/sites-enabled/000-default.conf),确保对应目录段包含:AllowOverride All(不能是None或FileInfo不全) - 如果项目部署在子目录(比如
/var/www/html/myapp),还要确认该目录的AllowOverride已放开
.htaccess 文件必须放在 public 目录且命名/权限正确
ThinkPHP 5.1+ 默认入口在 public/ 目录,.htaccess 必须放在这里,不是根目录也不是 application/。
- 文件名是
.htaccess(开头带点,Linux 下是隐藏文件;Windows 记事本另存为时要加英文引号:".htaccess") - 确保文件可被 Apache 读取:
chmod 644 public/.htaccess,不能是 777 或 600 - 内容用标准规则,不要加多余空行或 BOM 头:
RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] - 若部署在子路径(如
https://example.com/shop/),必须加RewriteBase /shop/(注意末尾斜杠)
ThinkPHP 路由开关和 URL 模式要匹配
即使服务器重写成功,框架不解析路由,URL 还是会 404。TP6 和 TP5.1+ 默认关闭路由,必须手动开。
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
立即学习“PHP免费学习笔记(深入)”;
- TP6:检查
config/route.php中'with_route' => true,或确认route/目录下有定义规则 - TP5.1:确认
config/app.php中'url_route_on' => true已开启 -
URL_MODEL在 TP5 已废弃,TP6 完全移除,别在配置里写这个 - 测试时用
php think route:list看当前注册的路由是否包含你期望的路径
常见错误现象和快速验证点
遇到伪静态不生效,按顺序排查比重写配置更有效。
- 访问
https://yourdomain.com/index.php/article/1能打开,但/article/1404 → 说明服务器重写没起作用 - 访问
/article/1返回 “No input file specified” 或空白 → PHP FastCGI 配置问题,不是伪静态问题 - 访问
/article/1显示 “The requested URL was not found on this server” → Apache 没加载.htaccess,查AllowOverride - 访问
/article/1显示 ThinkPHP 路由异常(如 “Route Not Found”)→ 框架路由未开启或没配规则 - 用
curl -I https://yourdomain.com/.htaccess返回 200 → 说明该文件能被直接下载,存在严重安全隐患,立刻设为deny from all或移出 Web 可访问路径
最易被忽略的是 AllowOverride All 这个配置项——它不在 .htaccess 里,而在 Apache 主配置中,且修改后必须重启服务。很多人反复改 .htaccess 却忘了这一步。


















