Назад | Перейти на главную страницу

Apache, именованные VirtualHosts с подстановочными знаками

Я хочу сопоставить 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 больше, чем я. Спасибо за комментарии.