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

не совсем уверен, что делать сейчас. Попробовали несколько вещи, которые, кажется, не работают.

какие идеи?

Обновление - 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 проживает в .

ошибка в общем журнал ошибок: [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 папка-каждая лаборатория теперь находится в , под 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>

это, с комбинацией акриловый DNS-прокси делает волшебство.

Обновление 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, вы можете сэкономить себе все виды головных болей (чувствительность к регистру имени файла только одна).