
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,再试
虚拟主机真正的麻烦不在配置本身,而在路径、权限、模块加载、网络层四者之间那种“看起来都对,但就是差一口气”的耦合。调一个地方,往往要同步核对三个文件、两个命令、一次重启——少一步,就卡在某个看似无关的错误里。











