Apache配Laravel虚拟主机不报403的关键是:DocumentRoot必须指向public目录,且对应目录块中需配置AllowOverride All,否则.htaccess失效导致路由404;同时要启用rewrite模块并确保配置已激活。

Apache怎么配Laravel虚拟主机不报403
直接给结论:不是Laravel的问题,是Apache没把DocumentRoot指向public/目录,且没开AllowOverride All。默认用php artisan serve只是开发捷径,真要模拟生产环境就得走Web服务器配虚拟主机。
常见错误现象:Forbidden You don't have permission to access this resource. 或访问首页显示目录列表(没走index.php)。
- 确保
DocumentRoot设为项目根目录下的public路径,比如/var/www/myapp/public,不是/var/www/myapp - 对应
<directory></directory>块里必须有AllowOverride All,否则.htaccess不生效,路由全404 - 确认
a2enmod rewrite已执行,且Apache配置里LoadModule rewrite_module没被注释 - 如果用macOS或Ubuntu,注意
/etc/apache2/sites-available/下启用的配置是否用a2ensite激活了
Nginx配Laravel本地站点老跳404
核心原因:Nginx不像Apache自动读.htaccess,必须手动把Laravel的重写规则写进server块,漏掉就只认index.php,其他URL全挂。
使用场景:你改了APP_URL、用了Vue Router history模式、或单纯想让/login这种路径不带index.php前缀。
- location块必须包含
try_files $uri $uri/ /index.php?$query_string;,这是Laravel官方唯一认可的重写逻辑 -
root指令要指向public目录,不是项目根目录;若用alias,路径末尾斜杠和拼接逻辑极易出错,优先选root - PHP-FPM的
fastcgi_param SCRIPT_FILENAME必须写成$realpath_root$fastcgi_script_name,否则$_SERVER['SCRIPT_FILENAME']会错,导致storage_path()等辅助函数失效
为什么php artisan serve不能当正式访问入口
因为它是PHP内置服务器,单线程、无静态文件缓存、不支持HTTPS、无法处理并发请求——它连“能用”都勉强,更别说“该用”。
性能影响:压测下QPS通常卡在5–10,而Apache/Nginx+PHP-FPM轻松过百;兼容性影响:不识别.env里的APP_URL用于生成绝对URL,邮件、API响应里的链接会错。
- 开发阶段图省事可以用,但一旦涉及前端资源加载、跨域、队列监听、WebSocket,立刻崩
- 浏览器访问
http://127.0.0.1:8000时,所有相对路径(如/css/app.css)会被解析成http://127.0.0.1:8000/css/app.css,而内置服务器不会自动映射到public/css/,常导致404 - 如果你在
.env里写了APP_URL=http://myapp.test,但实际用artisan serve访问,生成的密码重置链接就是错的
Windows上hosts和vhost配好还是打不开myapp.test
最常被忽略的一点:Windows防火墙或杀毒软件会拦截非80/443端口的本地HTTP请求,尤其当你把Apache/Nginx配成8080或8001这类端口时。
另一个隐蔽坑:Chrome/Edge对.test域名做了强制HTTPS重定向(因为ICANN把.test划为保留顶级域),哪怕你没配SSL,浏览器也会先发https://myapp.test,然后失败。
- 换用
.localhost或.dev(注意.dev需配HTTPS,否则现代浏览器拒接) - 检查
C:\Windows\System32\drivers\etc\hosts里有没有多余空格或中文字符,Windows hosts文件对格式极其敏感 - 用
curl -v http://myapp.localhost绕过浏览器,确认是服务没起来,还是浏览器拦截 - 如果用Docker或WSL2,
localhost在Windows宿主机上可能不指向容器内网,得查ipconfig里WSL2的IP再绑定
复杂点永远在路径和权限链上:从hosts → DNS解析 → Web服务器监听 → DocumentRoot指向 → .htaccess/Nginx重写 → PHP执行权限 → storage/logs写入权限,漏一环就静默失败。


















