带有通配符 VirtualDocumentRoot 的 VirtualHost

问题描述 投票:0回答:3

我正在尝试为我的虚拟主机创建后备方案。我的配置如下:

# 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.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
下。
更新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>

我使用它们:)你忘记关闭规范名称 - 不幸的是我不知道为什么我的配置中必须有 ServerAlias - 没有它它就无法工作 - 下面的代码经过测试并且可以工作 
apache2 xampp wildcard virtualhost directoryindex
3个回答
11
投票

鉴于您显然使用 Windows 进行开发,但(大概)部署到 Linux 进行生产,您是否考虑过使用虚拟机进行开发?

0
投票
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 作为所有者

Apache中带有通配符VirtualDocumentRoot的VirtualHost允许动态处理多个子域,根据子域名将它们定向到相应的目录。这对于迷你代理设置非常有用,它充当请求的中介,可以无缝访问不同的子域。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.