Apache部署Laravel重写规则生效需模块启用、Directory权限配置、DocumentRoot指向public三者协同:先启用mod_rewrite,再设AllowOverride All和Require all granted,最后确保.htaccess中RewriteEngine On及正确兜底规则。

Apache部署Laravel后,重写规则不是“加个.htaccess就行”,而是必须配合模块启用、目录权限和路径指向三者协同,否则路由404、静态资源加载失败、甚至直接暴露敏感文件。
启用mod_rewrite模块
这是所有重写的前提,未启用时.htaccess完全被忽略:
- Ubuntu/Debian系统执行:sudo a2enmod rewrite,然后重启服务:sudo systemctl restart apache2
- CentOS/RHEL检查
/etc/httpd/conf.modules.d/00-base.conf中是否已启用LoadModule rewrite_module modules/mod_rewrite.so - Windows(WAMP/XAMPP):打开
httpd.conf,取消#LoadModule rewrite_module modules/mod_rewrite.so前的#
配置DocumentRoot与Directory权限
Web根目录必须是public/,且Apache必须被明确授权读取其中的重写规则:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
DocumentRoot设为项目public目录,例如:
DocumentRoot /var/www/myapp/public - 在对应
<Directory>块中写全权限声明:
<Directory "/var/www/myapp/public"><br> Options Indexes FollowSymLinks<br> AllowOverride All<br> Require all granted<br> </Directory> -
AllowOverride All缺一不可——设成None或FileInfo会导致.htaccess不生效
确认public/.htaccess内容正确
Laravel默认自带该文件,但需核对关键部分是否完整(尤其子目录部署时):
- 开头必须有:
RewriteEngine On - 若部署在子目录(如
http://site.com/myapp/),RewriteBase必须匹配:RewriteBase /myapp/(末尾斜杠不能少) - 兜底规则应为:
RewriteRule ^(.*)$ index.php [L]或更规范的 Laravel 默认写法:RewriteRule ^ index.php [L] - 确保没有手动删除或注释掉
RewriteCond %{REQUEST_FILENAME} !-f和!-d这两行,否则真实文件(如CSS/JS)会被错误转发到index.php
验证与排错要点
配置完别急着刷新页面,先做这几步检查:
- 访问
http://your-domain.com/.htaccess,应返回403 Forbidden——说明文件存在且被服务器识别;若返回404或直接下载,说明路径或权限不对 - 临时在
public/.htaccess顶部加一行:RewriteRule ^test$ /index.php [L],然后访问/test,能跳转说明重写引擎工作正常 - 查看Apache错误日志:
sudo tail -f /var/log/apache2/error.log,常见报错如“RewriteCond: No such file”多因AllowOverride未生效,“AH00124: Request exceeded the limit”常因FollowSymLinks未开启 - 确保
APP_URL与实际访问地址一致(含协议和端口),否则生成的URL(如asset()链接)会指向错误路径

















