Apache Multiple VirtualDocumentRoot
Использование Apache2 в системе Linux - это способ иметь несколько VirtualDocumentRoot, используя mod_vhost_alias?
Это соглашение об именах, которое я использую в настоящее время, и хотел бы продолжать использовать:
host directory
127.0.0.1 domain domain.com
127.0.0.1 sub.domain domain.com_sub
Затем в разделе моего vhosts httpd.conf у меня есть:
NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
VirtualDocumentRoot /var/www/%0.0.com
</VirtualHost>
<VirtualHost 127.0.0.1>
VirtualDocumentRoot /var/www/%2.0.com_%1
</VirtualHost>
Проблема с этим - когда я посещаю sub.domain, журнал ошибок Apache показывает, что он ищет /var/www/sub.domain.com, а не /var/www/domain.com_test, что заставляет меня поверить только считывает первое правило, а затем терпит неудачу, но я бы хотел, чтобы это было сделано с использованием любого корня документа, который удовлетворяет одному из двух правил VirtualDocumentRoot.
Ответы
Ответ 1
Apache обычно выбирает первый виртуальный хост, чьи ServerName
или ServerAlias
соответствуют имени хоста, указанному в заголовке Host
HTTP. В вашем случае, поскольку у вас нет директив ServerName
, Apache якобы использует обратный DNS-поиск на IP-адресе для подделки имени сервера и полагая, что обратный DNS ведет к domain.com, который не соответствует, Apache тогда по умолчанию используется первый виртуальный хост. Звучит сложно, я знаю... в нижней строке, вы должны использовать ServerName
и ServerAlias
, чтобы сделать конфигурацию явной. Попробуйте еще что-нибудь подобное:
NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
ServerName domain.com
ServerAlias www.domain.com
VirtualDocumentRoot /var/www/%0
</VirtualHost>
<VirtualHost 127.0.0.1>
ServerName sub.domain.com
ServerAlias *.domain.com
VirtualDocumentRoot /var/www/%2.%3_%1
</VirtualHost>
Это должно использовать /var/www/domain.com
для http://domain.com и /var/www/www.domain.com
для http://www.domain.com, оба из которых обслуживаются первым vhost, а /var/www/sub.domain.com
для http://sub.domain.com, /var/www/blah.domain.com
для http://blah.domain.com и т.д.
Ответ 2
Вы должны квалифицировать обратные ссылки, когда хотите поставить '.' в пути к файлу. Поэтому вам нужно иметь это так:
VirtualDocumentRoot /var/www/%2.0.%3_%1
Ответ 3
Относительно OP и проблемы с установкой "/var/www/html":
Проблема, с которой я столкнулась, заключалась в использовании% 1 вместо% 2. Вот мой рабочий пример:
ServerAlias www.*.org.au
UseCanonicalName Off
VirtualDocumentRoot /path/to/sites/%2/pub
Надеюсь, что это поможет кому-то!
Я прочитал документы "Интерполяция имен каталогов" в mod_vhost_alias docs.
Ответ 4
То, что я замечаю в этой конфигурации, заключается в том, что $_SERVER ['DOCUMENT_ROOT'] указывает на /var/www/html, а не на root файл vhost.
странно.
Обновление (2010-07-24):
Я только что написал сообщение в блоге о том, как настроить сервер проверки HTTP
http://www.devcha.com/2010/07/how-to-setup-your-http-proof-server.html
Ответ 5
Наконец, я нашел конфигурацию, которая позволяет создавать гибкие субдомены.
См. документы apache в mod_vhost_alias
Если ваш корневой домен домена имеет 3 части, например dev.example.com, вы можете использовать %-4+
в качестве заполнителя для всего до корневого домена. Если у него 4 части, используйте %-5+
.
<VirtualHost *:80>
VirtualDocumentRoot "/var/www/%-4+/webroot"
ServerName www.dev.example.com
ServerAlias *.dev.example.com
php_admin_value auto_prepend_file /var/www/setdocroot.php
</VirtualHost>
Таким образом вы можете создать каталог с именем /var/www/sub.domain/webroot
и получить к нему доступ с URL sub.domain.dev.example.com
.
Линия php_admin_value auto_prepend_file /var/www/setdocroot.php
фиксирует docroot в некоторых системах, таких как OSX 10.9 +
Вот содержание setdocroot.php
:
<?php
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']);
?>