2009-04-16 6 views
59

У меня странная ситуация, когда я хочу иметь URL-адреса app1.example.com, example.com и *.example.com все с использованием другого виртуального хоста. Это то, что у меня есть (исключая example.com, потому что это просто делает его более грязным).Виртуальный хост для поддомена подкатегорий и статический субдомен

<VirtualHost *> 
    ServerName app1.example.com 
    ServerAlias app1.example.com 

    DocumentRoot = /var/www/app1 
    # Other configuration for this app here 

</VirtualHost> 

<VirtualHost *> 
    ServerName wildcard.example.com 
    ServerAlias *.example.com 

    DocumentRoot = /var/www/wildcard 
    # other configuration for this app here 

</VirtualHost> 

Проблема в том, что они конфликтуют. Кто бы ни был указан первым, побеждает. Как я могу разместить как виртуальный хост подстановки, так и определенный?

Примечание: я не просто изменяю DocumentRoot в конфигурации, поэтому с помощью mod_rewrite изменить переменную DocumentRoot не исправить.

ответ

134
<VirtualHost *:80> 
    DocumentRoot /var/www/app1 
    ServerName app1.example.com 
</VirtualHost> 

<VirtualHost *:80> 
    DocumentRoot /var/www/example 
    ServerName example.com 
</VirtualHost> 

<VirtualHost *:80> 
    DocumentRoot /var/www/wildcard 
    ServerName other.example.com 
    ServerAlias *.example.com 
</VirtualHost> 

Должно работать. Первая запись станет по умолчанию, если вы не получите явное совпадение. Поэтому, если бы у вас был app.otherexample.com, то он был бы пойман app1.example.com.

+1

Просто вопрос, что означает 'NameVirtualHost *: 80' делать? –

+0

Эта директива включает виртуальные хосты на основе имени и сообщает apache для прослушивания всех ip (*) на порту 80. Apache 2.2 Docs: http://httpd.apache.org/docs/2.2/en/vhosts/name-based .html –

+3

Удалите 'NameVirtualHost *: 80': AH00548: NameVirtualHost не имеет эффекта и будет удален в следующей версии. – nerdoc

1

Подстановочные знаки могут использоваться только в ServerAlias, а не в ServerName. Что-то, что меня насторожило.

Для вашего случая использования, следующий должна хватить

<VirtualHost *:80> 
    ServerAlias *.example.com 
    VirtualDocumentRoot /var/www/%1/ 
</VirtualHost> 

есть также более подробная информация на https://www.chris-shaw.com/blog/using-wildcards-in-virtual-hosts-on-apache