在我的本地开发服务器上,我使用如下域名设置了测试站点项目名称.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.dev
并www.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 替换
projectName.dev
。
如果您有多个项目,则需要为每个项目创建一个虚拟主机配置,但只为一个项目创建一个虚拟主机配置是一个很好的解决方法。 创建两个配置:
# 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 都指向同一个地方