Apache虚拟主机配置需完成加载、授权、路由、验证四步闭环:必须显式包含配置文件、设置DocumentRoot全路径执行权限与Require all granted、通过ServerName/ServerAlias正确路由、HTTP与HTTPS需分端口独立配置并启用mod_ssl。
Apache 虚拟主机配置不是写完 <VirtualHost> 就能跑起来,漏掉任一环节都可能返回 404、403 或始终访问默认站点。关键在“加载、授权、路由、验证”四步闭环。
Apache 不会自动读取 httpd-vhosts.conf 或 sites-available 下的文件,必须显式包含。
/etc/httpd/conf/httpd.conf,确认这行已取消注释:Include conf/extra/httpd-vhosts.conf
a2ensite 启用站点,例如:sudo a2ensite site-a.local.conf,再 sudo systemctl reload apache2
sudo httpd -M | grep vhost(CentOS)或 sudo apache2ctl -M | grep vhost(Ubuntu),看到 vhost_alias_module 表示模块已启用;再执行 sudo httpd -t 或 sudo apache2ctl -t 确保语法无误403 Forbidden 错误中,90% 源于路径权限或缺失 Require 指令。
www-data(Ubuntu)或 apache(CentOS),需对 整个路径链 具备执行(x)权限:DocumentRoot /var/www/site-a.local/public_html,则 /var、/var/www、/var/www/site-a.local、/var/www/site-a.local/public_html 每一级都得有 x 权限<VirtualHost> 内必须定义 <Directory> 块,并写明访问策略(Apache 2.4+):<Directory "/var/www/site-a.local/public_html"><br> Require all granted<br> AllowOverride None<br></Directory>
chmod 777,更安全的做法是:sudo chown -R $USER:www-data /var/www/site-a.localsudo chmod -R 750 /var/www/site-a.local
Apache 依据请求头中的 Host 字段顺序匹配 ServerName 和 ServerAlias,第一个完全匹配者胜出。
ServerName 必须是完整域名(如 site-a.local),不能带协议、端口或路径ServerAlias 可设多个别名,支持通配符:ServerAlias www.site-a.local *.site-a.local(但 *.local 不合法)<VirtualHost *:80> 的 ServerName 必须互不重复;否则后定义的将永远不会被命中/etc/hosts 文件模拟 DNS:127.0.0.1 site-a.local<br>127.0.0.1 site-b.local
HTTP 和 HTTPS 不能混在一个 <VirtualHost> 块里,HTTPS 需监听 443 端口并指定证书路径。
mod_ssl:sudo a2enmod ssl;CentOS:sudo yum install mod_ssl
<VirtualHost *:443><br> ServerName site-a.local<br> DocumentRoot "/var/www/site-a.local/public_html"<br> SSLEngine on<br> SSLCertificateFile /path/to/cert.pem<br> SSLCertificateKeyFile /path/to/privkey.pem<br> <Directory "/var/www/site-a.local/public_html"><br> Require all granted<br> </Directory><br></VirtualHost>
sudo ss -tlnp | grep ':443',确认 Apache 进程确实在监听