apache未启用mod_rewrite模块或未允许.htaccess解析导致laravel路由404,需启用rewrite模块、设置allowoverride all、确保documentroot指向public目录、正确配置rewritebase及验证.htaccess文件有效性。

Apache没启用mod_rewrite,所有Laravel路由都404
不是代码写错了,是Apache压根没读你的.htaccess。默认XAMPP关掉了重写模块,RewriteEngine On这行再正确也没用——引擎根本没启动。
打开C:\xampp\apache\conf\httpd.conf,确认这两处:
-
LoadModule rewrite_module modules/mod_rewrite.so这行前面不能有# - 找到类似
<directory></directory>的块,在里面把AllowOverride None改成AllowOverride All
改完必须点XAMPP控制面板里的“Restart Apache”,否则配置不生效。验证方式:在htdocs下放个.htaccess,内容只写RewriteEngine On,访问任意页面如果报500,说明模块已加载;如果毫无反应,AllowOverride还是None。
DocumentRoot指向错位置,.env文件可能被直接下载
Laravel项目根目录(含app/、config/、.env)绝不能当Web根目录。Apache若把DocumentRoot设成项目根,用户访问http://localhost/.env就能直接下载配置文件——这不是假设,是真实发生过的安全事件。
正确做法只有两种:
- 用虚拟主机:在
C:\xampp\apache\conf\extra\httpd-vhosts.conf里写DocumentRoot "C:/xampp/htdocs/myapp/public",并配<directory></directory>块启用AllowOverride All - 硬改全局配置:修改
httpd.conf里的DocumentRoot和对应<directory></directory>路径,都指向public子目录(注意路径末尾不加斜杠)
无论哪种,DocumentRoot的值必须精确到public目录,且<directory></directory>路径要和它完全一致,否则Require all granted可能不生效。
子目录部署时RewriteBase没填对,CSS/JS全404
把Laravel放在htdocs/blog/这种子路径下,asset('css/app.css')生成的URL是/css/app.css,但实际资源在/blog/css/app.css——浏览器自然404。问题不在Laravel,而在.htaccess没告诉Apache“基准路径是/blog/”。
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
打开public/.htaccess,确认第一行是RewriteEngine On,第二行必须是:
RewriteBase /blog/
注意:/blog/末尾的斜杠不能少,也不能多写成//blog/;大小写要和你在浏览器里访问的路径完全一致(比如/Blog/就无效);如果项目在根目录,这行直接删掉或注释掉。
别试图用APP_URL来“修复”这个路径——它只影响生成的绝对URL,不影响Apache重写行为。
public目录下.htaccess被删或编码错误,重写静默失效
Laravel 10+ 自带的public/.htaccess文件,内容极简但关键。有人手动删了它,或用记事本另存为UTF-8带BOM格式,导致Apache解析失败,RewriteRule整段被跳过。
标准内容应为:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]
RewriteRule ^(.*)$ index.php [QSA,L]
检查要点:
- 文件名必须是纯
.htaccess,不能叫htaccess.txt或.htaccess.bak - 用VS Code或Notepad++打开,确认编码是UTF-8无BOM(Notepad++:编码 → 转为UTF-8无BOM格式)
- Windows资源管理器默认隐藏扩展名,右键属性看“名称”字段是否真为
.htaccess
最麻烦的是,这类错误通常不报错,只是重写规则不生效——你得靠排除法:先确认mod_rewrite和AllowOverride都OK,再查这个文件本身。










