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