
Apache 配置虚拟主机时,DocumentRoot路径写错会导致 403 Forbidden
本地跑 PHP 项目,最常卡在访问直接报 403——不是权限问题,而是 DocumentRoot 指向了父目录或不存在的路径。Apache 默认拒绝访问非 DocumentRoot 下子目录以外的路径,且对符号链接、大小写敏感。
-
DocumentRoot必须是绝对路径,比如/Users/you/sites/myapp,不能写./myapp或~/sites/myapp - 对应
<directory></directory>块里的路径要完全一致,且末尾不加斜杠(/Users/you/sites/myapp✅,/Users/you/sites/myapp/❌) - macOS 上注意用户目录权限:如果用
~/Sites,确保www-data(或_www)用户能读取该路径,更稳妥的做法是把项目放/usr/local/var/www这类系统级可读路径
启用 vhost_alias 模块后,VirtualHost仍不生效?检查 httpd.conf 是否加载了配置文件
很多人改完 extra/httpd-vhosts.conf 就以为完事了,其实 Apache 默认注释掉了这行:Include /usr/local/etc/httpd/extra/httpd-vhosts.conf(macOS Homebrew 安装路径)或Include conf/extra/httpd-vhosts.conf(Windows XAMPP)。不取消注释,配置根本不会被读取。
- 先确认
httpd -M | grep vhost输出里有vhost_alias_module(否则VirtualHost语法直接报错) - 再执行
httpd -t验证配置语法,返回Syntax OK才算真正加载成功 - Windows 用户注意:XAMPP 控制面板里“Config → Apache (httpd.conf)”打开后搜索
httpd-vhosts,确保那行Include没被手动删掉或拼错
PHP 解析失败:浏览器显示源码而不是执行结果
虚拟主机配好了,但 .php 文件直接下载或显示明文,说明 PHP 模块没挂到这个 VirtualHost 上,或者 AddHandler 没匹配到请求。
- 全局开启 PHP 模块还不够,每个
VirtualHost里得显式声明:AddHandler application/x-httpd-php .php - 如果用了 PHP-FPM(比如 macOS 通过
brew install php装的),还要加ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/usr/local/var/www/,注意路径末尾的/和实际文档根对齐 - 别漏掉
DirectoryIndex index.php,否则访问http://myapp.test/会返回 403 或 404,而不是自动找index.php
hosts文件改了,ping myapp.test通但浏览器打不开
DNS 解析成功只说明域名能转 IP,不代表 Web 服务响应正常。常见干扰项是端口、协议、缓存三重叠加。
立即学习“PHP 免费学习笔记(深入)”;
- 确认 Apache 监听的是
80端口(查Listen 80是否在httpd.conf里启用),如果改过端口比如8080,浏览器必须输http://myapp.test:8080 - Chrome/Firefox 会强制 HTTPS 重定向(尤其用了
.dev、.app等预置 HSTS 域名),换.test或.localhost(后者无需hosts即可解析) - 清掉浏览器 DNS 缓存:
chrome://net-internals/#dns点 Clear host cache,再试
虚拟主机真正的麻烦不在配置本身,而在路径、权限、模块加载、网络层四者之间那种“看起来都对,但就是差一口气”的耦合。调一个地方,往往要同步核对三个文件、两个命令、一次重启——少一步,就卡在某个看似无关的错误里。






























