Корневой каталог Nginx на основе имени хоста без www

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

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

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

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

Пример:

  1. « www.mysite.com » и « mysite.com »

    root / var / www / mysite.

    Да, я видел, что есть и другие подобные вопросы ( как этот ), но мне было трудно удалить 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.

1
задан 13 April 2017 в 15:14
1 ответ

Вы можете использовать карту в блоке http следующим образом:

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

А затем вы можете использовать следующее на своем сервере блок:

root /var/www/$rootdir/public;

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

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

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

3
ответ дан 3 December 2019 в 18:31

Теги

Похожие вопросы