Apache配Laravel虚拟主机报403/404的根源是DocumentRoot未指向public目录且AllowOverride All缺失;必须设DocumentRoot为绝对路径如/var/www/myapp/public,并在对应中配置AllowOverride All和Require all granted,同时启用mod_rewrite及正确绑定hosts。

Apache 配 Laravel 虚拟主机报 403 或 404,根本不是 Laravel 代码问题,而是 DocumentRoot 指向错误 + AllowOverride All 缺失 —— 这两点没做对,其他配置全白搭。
DocumentRoot 必须指向 public/ 目录,不能是项目根目录
常见错误现象:访问 http://myapp.test 显示目录列表,或直接报 Forbidden You don't have permission to access this resource.。这是因为 Apache 把请求交给了项目根目录(含 .env、app/ 等敏感路径),而不是入口文件 public/index.php。
正确做法:
-
DocumentRoot必须设为项目内public子目录的绝对路径,例如:/var/www/myapp/public或C:/xampp/htdocs/myapp/public - 千万别写成
/var/www/myapp或C:/xampp/htdocs/myapp—— 否则.env可能被直接下载,storage/可能暴露 - 在 macOS/Linux 下注意路径斜杠方向,Windows 下用正斜杠
/或双反斜杠\,避免单反斜杠引发解析错误
AllowOverride All 是 .htaccess 生效的唯一前提
Laravel 的路由重写逻辑全靠 public/.htaccess 文件里的 RewriteRule。Apache 默认禁用该文件,除非显式允许。
关键配置必须出现在对应 块中:
- 路径要和
DocumentRoot一致,即,不是项目根目录路径 - 必须包含
AllowOverride All;写成AllowOverride None或漏掉这行,所有非/的路由都会 404 - Apache 2.4+ 还需加
Require all granted,否则仍可能 403
示例片段:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
<directory>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</directory>
rewrite 模块必须启用,且配置已加载
即使 AllowOverride All 写对了,如果 mod_rewrite 没启用,.htaccess 里的重写规则照样不执行。
检查与启用方法:
- Linux/macOS:运行
a2enmod rewrite,然后systemctl restart apache2(Ubuntu/Debian)或apachectl restart - Windows(XAMPP):打开
httpd.conf,确认LoadModule rewrite_module modules/mod_rewrite.so这行没被注释 - 验证是否生效:创建一个临时
public/test.php,访问时看$_SERVER['REDIRECT_REDIRECT_STATUS']是否存在,或直接php -m | grep rewrite
hosts 文件与虚拟主机名必须匹配
配置完 Apache 虚拟主机后,浏览器输 http://myapp.test 却跳转到默认站点或 404,大概率是 DNS 解析没走本地。
必须手动绑定域名:
- 编辑系统 hosts 文件:
/etc/hosts(macOS/Linux)或C:WindowsSystem32driversetchosts(Windows) - 添加一行:
127.0.0.1 myapp.test(注意无空格、无引号、无端口) - 不要用
localhost或127.0.0.1直接配,因为 Apache 会优先匹配第一个块,导致你的配置被绕过 - 改完 hosts 后无需重启 Apache,但浏览器可能需要清 DNS 缓存:
sudo dscacheutil -flushcache(macOS)或ipconfig /flushdns(Windows)
最容易被忽略的是 块的路径必须和 DocumentRoot 完全一致,差一个 /public 就会让整个重写链失效 —— 这不是配置顺序问题,是路径匹配失败。别信“差不多”,Apache 不认模糊匹配。










