Рейтинг:0

Избежать дублирования в конфигурации перенаправления nginx?

флаг sy

Настройка редиректов wwwбез www и HTTPHTTPS в то же время я столкнулся с проблемой дублирования, которую мне не удалось преодолеть.

На моем домене - пусть будет пример.comУ меня есть веб-сайт с основным именем другой.example.com. Я хочу, чтобы запросы пример.com, www.example.com, и www.another.example.com быть перенаправленным на другой.example.com, и все HTTP-запросы должны одновременно перенаправляться на HTTPS; Я также хочу поддерживать HTTP/2 и IPv6.

У меня нет проблем с тем, чтобы заставить это работать, но мне не удается избавиться от дублирования существенной части файла конфигурации (а именно, настроек сертификата HTTPS). Все попытки уменьшить дублирование приводят к прекращению работы одного, нескольких или всех перенаправлений (иногда вместе с HTTP/2).

Пожалуйста, взгляните на конфиг и предложите, как его почистить:

сервер {
    слушать 80;
    слушать [::]:80;
    имя_сервера www.another.example.com www.example.com other.example.com example.com;
    вернуть 301 https://another.example.com$request_uri;
}

сервер {
    слушать 443;
    слушать [::]:443;
    имя_сервера www.another.example.com www.example.com example.com;
    вернуть 301 https://another.example.com$request_uri;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    включить /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

сервер {
    имя_сервера другой.пример.com;
    корень /usr/share/nginx/another.example.com;
    индекс index.html;

    место расположения / {
        try_files $uri $uri/ =404;
    }

    слушать [::]:443 ssl http2;
    слушать 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    включить /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
Richard Smith avatar
флаг jp
См. [этот пример] (https://stackoverflow.com/questions/43081780/dns-records-redirect-www-to-non-www/43089681#43089681) на SO.
gxx avatar
флаг gb
gxx
В качестве альтернативы, переместите общие настройки в специальную конфигурацию и полагайтесь на `include`.
флаг sy
@RichardSmith после перемещения четырех повторяющихся строк во внешний блок (и удаления их в обоих внутренних блоках) я получаю ошибки конфигурации: `nginx: [предупреждать] повторяющееся значение «TLSv1.2» в /etc/letsencrypt/options-ssl-nginx .conf:11 nginx: [предупреждение] повторяющееся значение «TLSv1.3» в /etc/letsencrypt/options-ssl-nginx.conf:11 nginx: [появление] Директива «ssl_prefer_server_ciphers» дублируется в /etc/letsencrypt/options-ssl-nginx.conf:12 nginx: проверка файла конфигурации /etc/nginx/nginx.conf не удалась`
Richard Smith avatar
флаг jp
Похоже, у вас где-то дублируются утверждения. Используйте `nginx -T` (заглавная буква `T`), чтобы просмотреть всю конфигурацию во всех включенных файлах.
флаг sy
@RichardSmith да, ты прав. Но после того, как я отследил дублирование, возникла другая проблема: в моем конфиге nginx на самом деле несколько доменов верхнего уровня. Если я перенесу конфигурацию SSL из блока сервера на верхний уровень, то будет работать только один домен (например, `example.com`).
Richard Smith avatar
флаг jp
В этом случае ваша первоначальная установка, вероятно, является лучшим, чего вы можете достичь. Если у вас есть большое количество повторяющихся операторов, вы можете поместить их во включенный файл.
Рейтинг:0
флаг in
сервер {
    имя_сервера другой.пример.com;
    корень /usr/share/nginx/another.example.com;
    индекс index.html;

    место расположения / {
        try_files $uri $uri/ =404;
    }

    слушать [::]:443 ssl http2;
    слушать 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    включить /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
сервер {
    слушать 443 ssl;
    слушать [::]:443 ssl;
    имя_сервера www.another.example.com www.example.com example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    включить /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    переписать ^/(.*)$ https://another.example.com/$1 навсегда;
}
сервер {
    слушать 80;
    слушать [::]:80;
    имя_сервера www.another.example.com www.example.com other.example.com example.com;
    место расположения / {
        если ($хост !~* ^(www)) {
          переписать ^/(.*)$ https://another.example.com/$1 навсегда;
        }
    }
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.