VirtualHost с подстановочным знаком VirtualDocumentRoot

Я пытаюсь создать резерв для моих виртуальных хостов. Моя конфигурация выглядит так:

# 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 продолжает показывать мне пустой индекс каталога ( "Index of" ).

Не уверен, что делать сейчас. Попробовали несколько вещей, ни одна из которых не работает.

Любые идеи?

Обновление - 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". Комментируя это (и тем самым делая правило Labs единственным) инициировало ошибку Запретить доступ.

Также обратите внимание, что я больше не использую папку 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 г.)

Новая директива для заинтересованных (используя последний 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 г.)

Теперь я использую Макро-подход.

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

Ответ 1

Я использую их:) Вы забыли о выключении канонических имен - к сожалению, я не знаю, почему в моей конфигурации должен быть 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>

Ответ 2

Учитывая, что вы, очевидно, используете окна для разработки, но (предположительно) для развертывания в Linux для производства, подумали ли вы об использовании виртуальной машины для разработки?

Я написал руководство для настройки здесь: http://otaqui.com/blog/1652/setting-up-a-virtualbox-virtual-machine-for-web-development-with-multiple-sites-using-mod_vhost_alias-and-virtualdocumentroot/, но по существу:

  • Поделитесь каталогом (например, C:\VirtualWWW) с HOST в GUEST
  • Установите этот share как /var/www в GUEST, с www-данными в качестве владельца
  • Настройка vhost_alias и VirtualDocumentRoot для сопоставления подкаталогов в C:\VirtualWWW с субдоменами виртуальных хостов, то есть C:\VirtualWWW\project1 сопоставляется с http://project1.vhost/

Настройка новых проектов так же просто, как создание нового каталога на вашем хосте, и гость виртуальной машины использует это. Если вы выполняете развертывание в Linux, вы можете сэкономить все виды головных болей (имя файла с учетом регистра только один).