Я пытаюсь создать резерв для моих виртуальных хостов. Моя конфигурация выглядит так:
# 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>