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']);
?>