Мне нужно использовать 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 (который все чаще считается обязательным для любого типа услуг), это в любом случае потребует добавления сертификатов, которые можно использовать для всех этих клиентских доменов.
(Рассмотрим автоматизацию, а не одну статическую конфигурацию, которая будет работать для всего.)