我正在尝试为我的虚拟主机创建一个回退。我的配置如下所示:
# Fetch all pre-defined hosts
Include "conf/extra/vhosts/*.conf"
# Fallback
NameVirtualHost *:80
<Directory "C:/LocalServer/usr">
Options Indexes FollowSymLinks Includes
AllowOverride All
Order allow,deny
Allow from all
</Directory>
<VirtualHost *:80>
VirtualDocumentRoot "C:/LocalServer/usr/%-1/projects/%-2+/public/"
</VirtualHost>
此处的目标如下:如果我尝试访问http://test.lab/
,我希望它自动选择以下目录:C:/LocalServer/usr/lab/projects/test/public/
。
现在,我创建了文件夹和一个空索引文件(index.php
)。尽管如此,Apache仍然向我显示一个空的目录索引(“索引”)。
现在不知道该怎么办。尝试了一些事情,但似乎都没有。
有什么想法吗?
我现在正在使用此代码,基于第一个答案(嗯,唯一的答案):
<VirtualHost *:80>
UseCanonicalName Off
ServerAlias *.lab
VirtualDocumentRoot "C:/LocalServer/%2/%1/public"
<Directory "C:/LocalServer/%2/%1/public">
Options Indexes FollowSymLinks Includes
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
我现在从Apache获得 Access forbidden 错误。通常,当目录不存在时,通常会收到此错误? C:/LocalServer/lab/test/public
确实存在,空index.php
位于public
目录中。
常规错误日志中的错误:[client 127.0.0.1:49342] AH01797: client denied by server configuration: C:/LocalServer/lab/test/public/
如果删除<Directory/>
组,则不会发生任何变化。我仍然得到错误。 (我甚至可以在该组中使用%n
吗?)
之前没有工作的原因是由于我通过Include "conf/extra/vhosts/*.conf"
指令导入了其他虚拟主机。评论它(从而使实验室规则成为唯一的一个)启动了禁止访问错误。
另请注意,我不再使用usr
文件夹 - 每个实验室现在位于lab
下的LocalServer
文件夹中。
似乎<Directory/>
块不允许插入变量,例如VirtualDocumentRoot
。
它现在正在工作 - 没有帮助就无法做到这一点。这是最终的代码:
<VirtualHost lab:80>
UseCanonicalName Off
ServerAlias *.lab
VirtualDocumentRoot "C:/LocalServer/%2/%1/public"
<Directory "C:/LocalServer/lab/*/public">
Options Indexes FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow from all
</Directory>
</VirtualHost>
新指令:
<VirtualHost *:80>
UseCanonicalName Off
ServerAlias *.local
VirtualDocumentRoot "D:/home/%-2+/public_html"
<Directory "D:/home/*/public_html">
Require all granted
AllowOverride All
Options Indexes FollowSymLinks
</Directory>
</VirtualHost>
通过Acrylic DNS Proxy的组合,这会产生魔力。
我现在正在使用Macro approach。
# Directory Macro - Default Directory configuration on a per-vhost basis
<Macro Directory $dir>
<Directory "z:/var/www/$dir/public_html">
Require all granted
Options Includes Indexes FollowSymLinks
AllowOverride All
</Directory>
</Macro>
# LocalSub Macro - For specific *.*.local subs that require their own root
<Macro LocalSub $sub $domain>
<VirtualHost 127.0.0.1>
ServerName $sub.$domain.local
DocumentRoot “z:/var/www/$domain/$sub/public_html”
Use Directory $domain/$sub
</VirtualHost>
</Macro>
Use LocalSub blog rockettpw
# Main virtual host
<VirtualHost 127.0.0.1>
UseCanonicalName Off
ServerAlias *.local *.*.local
VirtualDocumentRoot “z:/var/www/%-2/public_html”
Use Directory *
</VirtualHost>
答案 0 :(得分:9)
我使用它们:)你忘了关闭规范名称 - 遗憾的是我不知道为什么我的配置中必须有ServerAlias - 如果没有它就行不通 - 下面的代码经过测试和工作
<Directory "C:/LocalServer/*/public">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
Require local
</Directory>
<VirtualHost *:80>
# Apache will form URLs using the hostname supplied by the client
UseCanonicalName Off
# available aliases to use
ServerAlias *.lab *.lab2
# where to put them
VirtualDocumentRoot "C:/LocalServer/%2/%1/public/"
</VirtualHost>
答案 1 :(得分:0)
鉴于您显然正在使用Windows进行开发,但(可能)部署到Linux进行生产,您是否考虑过使用虚拟机进行开发?
我已经写了一个在这里设置的指南:http://otaqui.com/blog/1652/setting-up-a-virtualbox-virtual-machine-for-web-development-with-multiple-sites-using-mod_vhost_alias-and-virtualdocumentroot/但实质上是:
设置新项目就像在主机上创建新目录一样简单,虚拟机来宾使用它。如果你要部署到linux,你可能会节省各种麻烦(文件名区分大小写只有一个)。