Я хочу сопоставить www.example.com с конкретным виртуальным хостом, а затем хочу, чтобы все другие поддомены example.com перешли на другой виртуальный хост.
Для этого я создал эти хосты:
<VirtualHost *:80>
ServerName www.example.com
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
</VirtualHost>
Теперь выбор хоста кажется довольно случайным. Если я перезапускаю apache, иногда я получаю один хост, а иногда другой.
Что я делаю не так?
Спасибо!
Обновление: если я запускаю apache2ctl -S в этой конфигурации, я получаю этот вывод:
VirtualHost configuration: wildcard NameVirtualHosts and _default_ servers: *:80 is a NameVirtualHost default server www.example.com (/etc/apache2/sites-enabled/dev:3) port 80 namevhost www.example.com (/etc/apache2/sites-enabled/dev:3) port 80 namevhost example.com (/etc/apache2/sites-enabled/dev:22)
После долгих поисков я решил отключить моно-приложения, которые у меня были запущены, и вот, он начал обслуживать файлы с правильного сайта. Их нужно было вводить в следующем порядке:
<VirtualHost *:80>
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
</VirtualHost>
как предложил Wizard. Чтобы мои моно-приложения работали, я использовал «MonoAutoApplication enabled» на каждом виртуальном хосте. Однако я не уверен, что это лучший вариант, как на моно сайт он говорит, что вы не должны использовать автоматический хостинг для приложений asp.net mvc (это то, что я использую). Но пока я не вижу обратной стороны.
Код, вероятно, должен быть:
<VirtualHost _default_:80>
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
</VirtualHost>
Видеть: http://httpd.apache.org/docs/2.2/vhosts/examples.html#default
Это явно определяет vhost "example.com" в качестве хоста, который будет использоваться, если ничего не подходит.
Вы уверены, что www.example.com
vhost появляется перед другим vhost в файле конфигурации? Apache должен пройти по виртуальным хостам по порядку и выбрать первый с ServerName
или ServerAlias
что соответствует значению, отправленному в Host
Заголовок HTTP. Кажется очень странным, что иногда он случайным образом выбирает один виртуальный хост, а иногда другой.
Может помочь отредактировать ваш вопрос, включив в него вывод
apache2ctl -S
который показывает определенные виртуальные хосты так, как их видит Apache.
Обновление: * допустимый синтаксис, но не обязательный. Вы можете узнать больше Вот.
Но это сработает.
<VirtualHost *:80>
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
</VirtualHost>
Первая директива будет соответствовать всему, что явно не определено в другом месте.
Вам необходимо добавить DocumentRoot в конфигурацию. Должно получиться примерно так:
# Ensure that Apache listens on port 80
Listen 80
# Listen for virtual host requests on all IP addresses
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example1.com
# Other directives here
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example2.org
# Other directives here
</VirtualHost>
РЕДАКТИРОВАТЬ: Кажется, я думал, что знаю об Apache больше, чем я. Спасибо за комментарии.