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>

Теперь я получаю ошибку Access Access от 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>

2 ответа

Решение

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

Учитывая, что вы, очевидно, используете 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/ но по сути:

  • Предоставить общий доступ к каталогу (например, C: \ VirtualWWW) из хоста в гостевой
  • Смонтируйте этот общий ресурс как / var / www в ГОСТЕ с владельцем www-данных
  • Настройте vhost_alias и VirtualDocumentRoot для сопоставления подкаталогов в C: \ VirtualWWW с поддоменами виртуального хоста, т.е. C:\VirtualWWW \ project1 сопоставлен с http://project1.vhost/

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

Другие вопросы по тегам