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