如何配置vhost.conf实现子域名指向同服务器的另一Laravel站点
配置问题排查与修复方案
现有配置的错误点
- 子域名配置中的Rewrite规则完全无效:
%{SERVER_NAME}仅匹配域名部分,不包含任何路径后缀,你写的RewriteCond %{SERVER_NAME} =subdomain.site1.org/site2永远不会命中,多余的规则还可能干扰正常配置 - 路径匹配优先级问题:如果存在默认虚拟主机(比如Apache自带的000-default.conf)加载顺序早于你的子域名配置,且默认主机的DocumentRoot指向
/var/www/html,就会出现访问子域名打开根目录index.html的情况 - 额外错误:主站site1的Directory配置缺少根路径前缀,写为
"var/www/html/site1/",正确写法应为"/var/www/html/site1/" - 注意Laravel规范:如果你的site2目录是完整的Laravel项目,默认入口文件在
public目录下,当前DocumentRoot直接指向site2目录本身也是配置错误
修复步骤
- 删掉子域名虚拟主机里的错误Rewrite规则段,修正后的子域名配置如下:
<VirtualHost *:80> DocumentRoot /var/www/html/site2 # 要是标准Laravel项目,上面一行改成 DocumentRoot /var/www/html/site2/public ServerName subdomain.site1.org CustomLog logs/subdomainsite1org-access.log common AddDefaultCharset UTF-8 <Directory "/var/www/html/site2/"> # 对应上面改了public的话这里也改成"/var/www/html/site2/public/" Options ExecCGI FollowSymLinks AllowOverride All Order allow,deny Allow from all Require all granted </Directory> </VirtualHost>
- 调整虚拟主机加载优先级:Apache会按配置文件名的字典序加载配置,优先匹配先加载的规则,你可以把子域名配置的文件名改为主站配置之前,比如子域名为
001-subdomain.conf,主站为002-site1.conf,同时禁用默认的000-default.conf配置 - 确认路径一致性:检查你的站点实际目录是不是和配置里的
/var/www/html/xxx完全匹配,如果你的www目录直接在根路径下,就把配置里的路径改为/www/html/xxx - 验证配置并重启服务:
- 运行
apache2ctl configtest(Debian/Ubuntu)或httpd -t(CentOS/RHEL)确认配置语法无误 - 运行
systemctl restart apache2(Debian/Ubuntu)或systemctl restart httpd(CentOS/RHEL)重启服务生效
- 运行
验证方法
执行apache2ctl -S(Debian/Ubuntu)或httpd -S(CentOS/RHEL)查看已加载的虚拟主机列表,确认subdomain.site1.org对应的根目录为你设置的/var/www/html/site2即可。
内容的提问来源于stack exchange,提问作者masomi79
相关产品推荐
相关产品推荐

