将 www 子域名添加到我的 Wildcard Virtualhost

将 www 子域名添加到我的 Wildcard Virtualhost

在我的本地开发服务器上,我使用如下域名设置了测试站点项目名称.dev

在我的 Apache 配置文件中使用以下设置...

NameVirtualHost *:80

<VirtualHost *:80>
   VirtualDocumentRoot  E:/Server/htdocs/projects/%1/www
   ServerAlias *.dev
</VirtualHost>

这使我能够projectName.dev在浏览器中访问,它将从中加载文件E:/Server/htdocs/projects/projectName/www/

我想修改它,以便如果我www在我的示例中使用子域,我也可以访问相同的文件夹projectName.devwww.projectName.dev加载相同的文件。

有人能帮我做这个吗?我不太理解文档

答案1

您可以尝试以下操作

NameVirtualHost *:80

<VirtualHost *:80>
   VirtualDocumentRoot  E:/Server/htdocs/projects/%-2/www
   ServerName staging.dev
   ServerAlias *.dev www.*.dev
</VirtualHost>

您可以使用 %-2 始终获取“项目”名称。%-2 为您提供 URL 的倒数第二部分。例如,如果 URL 为http://project1.dev/那么 docroot 将是 E:/Server/htdocs/projects/project1/www

答案2

ALex_hha 的回复是正确的,问题在于 VirtualDocumentRoot 中的 %1。它被使用的主机名替换。同时使用多个通配符变体和 VirtualDocumentRoot 总是很棘手。

您有两个解决方案:

  1. 用硬编码的 %1 替换projectName.dev
    如果您有多个项目,则需要为每个项目创建一个虚拟主机配置,但只为一个项目创建一个虚拟主机配置是一个很好的解决方法。
  2. 创建两个配置:

    # www.project.dev format 
    <VirtualHost *:80>
      VirtualDocumentRoot  E:/Server/htdocs/projects/%2+/www
      ServerName www.*.dev
    </VirtualHost>
    
    # project.dev format
    <VirtualHost *:80>
      VirtualDocumentRoot  E:/Server/htdocs/projects/%1/www
      ServerName *.dev
    </VirtualHost>
    

%2+ 表示您希望接收主机名的第二部分和前一部分。检查mod_vhost 帮助页面了解更多信息

您没有使用 unix,但在 unix 上您也可以从 www 名称到项目名称建立符号链接:

cd /srv/
for i in *; do 
   # bypass if not a directory
   if [ ! -d "$i" ]; then continue; fi
   # bypass if already created
   if [ -e "www.$i" ]; then continue ; fi
   # bypass if already a www
   echo $i | fgrep -q "www" && continue
   ln -s $i www.$i
done

这样,projectname 和 www.projectname 都指向同一个地方

相关内容