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

Корень Nginx на основе имени хоста без www

Английский не является моим родным языком, примите мои извинения за любые языковые проблемы.

Я хочу, чтобы конфигурация с автоматическим корнем, независимо от домена, выглядела так (с использованием nginx):

root /var/www/${http_host}/public

Но я хочу, чтобы корневой домен и «www» указывали на один и тот же каталог, но без «www»:

Пример:

  1. "www.mysite.com" и "mysite.com"

    корень / var / www /mysite.com/ public

  2. Но "blog.mysite.com"

    корень / var / www /blog.mysite.com/ public


That is, only the "www" should point to the directory that does not have "www" in the name.

Да, я видел, что есть и другие подобные вопросы (как этот), но мне было трудно удалить www. Прошу прощения!

Я не буду использовать такой универсальный название сервера, но это должно работать даже с:

server_name ~.+$;

Но также так:

listen 443 ssl http2;

server_name ~ ^((www|blog|account|bbs)\.)?mysite.com$;

root /var/www/${http_host}/public

ssl_certificate /ssl/${http_host}/{http_host}.pem
ssl_certificate_key /ss/${http_host}/{http_host}.key

ПРИМЕЧАНИЕ. Он должен работать с SSL-сертификатом.

Вы можете использовать map в http блок вроде этого:

map $http_host $rootdir {
    "~^(?:www\.)?(<domain>.+)$ $domain;
}

И затем вы используете следующее в своем server блок:

root /var/www/$rootdir/public;

в map директива, мы конвертируем $http_host переменная, содержащая HTTP-запрос Host заголовок в $rootdir используя регулярное выражение.

В регулярном выражении мы извлекаем фактическое доменное имя в $domain переменная из Host заголовок, исключив www. префикс, если он существует. Затем мы используем $domain переменная для построения $rootdir переменная.

Однако этот метод может не работать с SSL по причинам, указанным в комментарии. В этом случае вам необходимо реализовать систему управления конфигурацией, которая генерирует файлы конфигурации для доменов из шаблонов.