thinkphp在xampp下伪静态404的主因是mod_rewrite未启用或.htaccess被忽略:需取消httpd.conf中loadmodule rewrite_module注释、设allowoverride all并覆盖项目目录、.htaccess置于项目根目录且用兼容规则,最后确保端口空闲并重启apache。

ThinkPHP 项目在 XAMPP 下跑不起来伪静态(比如访问 /index/user/login 报 404),不是代码问题,大概率是 Apache 的 mod_rewrite 没真正启用,或 .htaccess 被忽略 —— 这两个环节必须同时满足,缺一不可。
确认 mod_rewrite 模块已加载且未被注释
很多人改了 httpd.conf 却没生效,第一关就卡在这儿。Apache 启动时不会报错提示模块加载失败,但 mod_rewrite 若未启用,所有重写规则都等于废纸。
- 打开
XAMPP\apache\conf\httpd.conf(Windows)或/opt/lampp/etc/httpd.conf(Linux) - 搜索
#LoadModule rewrite_module modules/mod_rewrite.so,确保这行前面的#已删除,变成LoadModule rewrite_module modules/mod_rewrite.so - 保存后重启 Apache —— 不重启等于没改
- 可访问
http://localhost/xampp/phpinfo.php,Ctrl+F 搜mod_rewrite,若出现在 “Loaded Modules” 列表里才算成功
AllowOverride 必须设为 All,且作用域要覆盖你的项目目录
ThinkPHP 的 .htaccess 文件只在 Apache 明确允许的情况下才会被读取。常见错误是只改了默认的 <directory></directory> 段,但你的项目实际放在 htdocs/thinkphp6 或其他子目录下,而该子目录没被包含在配置段里。
- 在
httpd.conf中找到你项目所在的<directory></directory>块(例如<directory></directory>) - 确认其中包含
AllowOverride All(不是None,也不是FileInfo等子集) - 同时检查是否启用了
Options FollowSymLinks—— ThinkPHP 规则依赖此选项,否则会报 500 错误 - 如果项目在虚拟主机下(如用
project.test域名),则必须在httpd-vhosts.conf对应的<virtualhost></virtualhost>内再写一遍AllowOverride All
ThinkPHP 自带的 .htaccess 规则需适配 XAMPP 默认配置
ThinkPHP 官方生成的 .htaccess 在部分 XAMPP 版本中会因 MultiViews 冲突或路径解析差异导致 500 错误。直接照搬不一定能用。
- 确保
.htaccess放在项目根目录(即包含public/子目录的那层,不是public/里面) - 推荐使用 ThinkPHP 6.1+ 官方精简版规则(兼容性更强):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ public/index.php [L,E=PATH_INFO:$1]
- 避免使用
RewriteBase /—— XAMPP 本地开发一般不需要,加了反而容易出错 - 若仍报 500,临时在
.htaccess开头加Options -MultiViews关闭内容协商机制
测试时别用 localhost 根路径,要带项目子目录或域名
ThinkPHP 的路由解析依赖请求 URI 的路径层级。如果你把项目放在 htdocs/blog,却用 http://localhost/ 访问,Apache 找不到对应入口,.htaccess 也压根不会触发。
- 正确访问方式是:
http://localhost/blog/index/user/login(假设项目在 blog 目录) - 更稳妥的做法是配虚拟主机:在
httpd-vhosts.conf中定义blog.test,并在系统hosts文件添加127.0.0.1 blog.test,然后访问http://blog.test/index/user/login - 务必注意:浏览器地址栏显示的路径,就是 Apache 解析
.htaccess和路由时看到的原始路径 —— 这个不能错
最容易被忽略的是:XAMPP 的 Apache 默认监听 80 端口,但 Windows 下 Skype、IIS、甚至某些杀毒软件会偷偷占着 80,导致你改完配置却启动失败,连日志都不报 —— 先检查 netstat -ano | findstr :80,确认端口空闲再折腾重写规则。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











