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

VirtualHost на основе CNAME с подстановочными доменами в Apache

Мне нужно использовать Apache для достижения такой конфигурации, и я хотел бы получить несколько советов.

У меня есть домен: example.com. Мы развернули веб-сайт в / var / www / html, доступный через www.example.com. Кроме того, мы разрешаем пользователям регистрироваться и получать доступ к содержимому (эти пользователи затем становятся нашими арендаторами). Такое зависящее от клиента содержимое развертывается в / var / www / tenants. Для каждого из арендаторов мы создаем поддомен. Например, для арендатора A мы создаем tenanta.example.com. Каждый раз, когда кто-то переходит по этому URL-адресу, он может получить доступ к некоторому контенту, специфичному для клиента A.

Теперь арендатор A хочет создать специальный домен для tenanta.example.com. Скажем, тщательный домен: help.tenanta.com, где tenanta.com - это домен, зарегистрированный арендатором A. Он устанавливает запись CNAME, чтобы указать help.tenanta.com на tenanta.example.com.

Теперь дело доходит до части Apache. Как мне настроить файл конфигурации так, чтобы запрос на help.tenanta.com получал содержимое в / var / www / tenants, а не в / var / www / html?

Вот что я пробовал:

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName www.example.com
    ServerAlias example.com, cdn.example.com
    # See: http://stackoverflow.com/questions/2297403/http-host-vs-server-name
    UseCanonicalName on

    DocumentRoot /var/www/html
<VirtualHost>

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerAlias *.example.com
    UseCanonicalName on

    DocumentRoot /var/www/tenants
<VirtualHost>

Но в таких условиях запрос на help.tenanta.com по-прежнему поступает в / var / www / html, а не в / var / www / tenants.

Примечание: аналогичные вопросы задавались по serverfault, например: Виртуальный хост Apache на основе CNAME

, но они не решают проблему поддомена с подстановочными знаками.

Прежде всего, отмечу, что использование CNAME записей не является фактором, функциональность виртуального хоста на основе имени основана на HTTP Host только заголовок (т. е. часть хоста URL-адреса запроса).

Если идея состоит в том, что вы хотите, чтобы это работало, не изменяя конфигурацию Apache httpd при добавлении доменов тщеславия для конкретных клиентов, я не вижу способа, чтобы вы могли выполнять эту работу на основе виртуальных хостов на основе имен (т. Е. На основе ServerName / ServerAlias) напрямую.

Что может сработать, так это полагаться на поведение vhost по умолчанию, когда нет соответствия для ServerName / ServerAlias:

Vhost на основе имени по умолчанию для комбинации IP и порта

Если совпадение ServerName или ServerAlias ​​не найдено в наборе виртуальных хостов, содержащих наиболее конкретную совпадающую комбинацию IP-адреса и порта, тогда первый указанный виртуальный хост что соответствует, что будет использоваться.


Конечно, если вы хотите обслуживать это через HTTPS (который все чаще считается обязательным для любого типа услуг), это в любом случае потребует добавления сертификатов, которые можно использовать для всех этих клиентских доменов.
(Рассмотрим автоматизацию, а не одну статическую конфигурацию, которая будет работать для всего.)