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

Динамический VirtualHosts (CNAME)

У меня динамически настроенные виртуальные хосты:

UseCanonicalName Off

<VirtualHost *:80>
  ServerAlias *.projects.domain.com
  VirtualDocumentRoot /var/www/projects/%-4
</VirtualHost>

<VirtualHost *:80>
  ServerAlias *.testing.domain.com
  VirtualDocumentRoot /var/www/testing/%-4
</VirtualHost>

Он отлично работает, когда я печатаю в браузере xxx.projects.domain.com или yyy.testing.domain.com НО:

Это не работает с записями CNAME. Например: xyz.com => abc.projects.domain.com.

Как настроить apache для динамического выбора виртуального хоста в соответствии с разрешенным DNS-именем (abc.projects.domain.com), а не в соответствии с заголовком HTTP HOST (xyz.com) без вставки xyz.com в конфиг apache?

Если вам не нравятся повторяющиеся конфигурации VirtualHost, есть еще один вариант использования символические ссылки.

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

ln -l /var/www/projects/abc /var/www/links/xyz.com
ln -l /var/www/projects/abc /var/www/links/abc.projects.domain.com

Затем настройте VirtualHost следующим образом:

<VirtualHost *:80>
  ServerAlias *.projects.domain.com
  VirtualDocumentRoot /var/www/links/%0
</VirtualHost>

Таким образом, ваш сайт будет доступен как для xyz.com, так и для abc.projects.domain.com. Единственное, что ты нужно автоматизировать (например, cron) - создание символических ссылок.

Это не работает с записями CNAME.

CNAME только указывает ему использовать те же записи DNS, что и цель, он не сообщает вашему HTTP-серверу (Apache), что, когда он видит домен CNAME, он должен обрабатывать его так же, как цель CNAME.

Есть несколько вариантов, но по существу вам нужно указать, что xyz.com каким-то образом является псевдонимом abc.projects.domain.com.

Есть несколько вариантов перечислено здесь который может сработать для вас. Например, см. «Использование отдельного файла конфигурации виртуального хоста».

Я столкнулся с подобной ситуацией, и в конце концов я просто сгенерировал правильную конфигурацию vhost для всех моих доменов, включая их псевдонимы, с помощью Chef. Я обнаружил, что это проще и надежнее, чем пытаться делать это динамически.