14

我正在尝试为我的虚拟主机创建一个后备。我的配置如下所示:

# 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 一直向我显示一个空的目录索引(“索引”)。

不太清楚现在该做什么。尝试了一些东西,但似乎都没有。

有任何想法吗?

更新 - 6 月 1 日

我现在正在使用此代码,基于第一个答案(嗯,唯一一个):

<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收到访问禁止错误。通常,当目录不存在时,人们肯定会收到此错误吗?确实存在C:/LocalServer/lab/test/public,并且目录中存在一个空。index.phppublic

一般错误日志中的错误:[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 现在都位于该lab文件夹中,位于LocalServer.

更新 2

似乎该<Directory/>块不允许插入变量,就像VirtualDocumentRoot那样。

更新 3 - 找到解决方案

它现在正在工作 - 如果没有帮助,将无法做到这一点。这是最终的代码:

<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>

更新 4(2015 年 4 月)

新指令,对于那些感兴趣的人(使用最新的 Apache 2.4):

<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的结合,创造了奇迹。

更新 5(2016 年 12 月)

我现在正在使用宏方法

# 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>
4

2 回答 2

11

我使用它们 :) 您忘记关闭规范名称 - 不幸的是,我不知道为什么我的配置中必须有 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>
于 2013-05-31T21:53:24.330 回答
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/但本质上:

  • 从 HOST 到 GUEST 共享一个目录(例如 C:\VirtualWWW)
  • 在 GUEST 中将该共享挂载为 /var/www,以 www-data 作为所有者
  • 设置 vhost_alias 和 VirtualDocumentRoot 将 C:\VirtualWWW 中的子目录映射到虚拟主机子域,即 C:\VirtualWWW\project1 映射到http://project1.vhost/

设置新项目就像在主机上创建一个新目录一样简单,虚拟机来宾使用它。如果您正在部署到 linux,您可能会省去各种麻烦(文件名区分大小写只是其中之一)。

于 2013-10-04T08:23:15.907 回答