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

Как настроить nginx для перенаправления всех запросов с псевдонимов домена на основной домен?

У меня есть сервер nginx, который отвечает на несколько доменов, и я хочу перенаправить все запросы на основной домен.

Пример: веб-сайт отвечает за xxx xxx.example.com yyy.example.com $hostname для обоих http и https.

Я хочу настроить сервер таким образом, чтобы все запросы к другим доменным именам были перенаправлены на xxx.example.com.

Самый эффективный и чистый способ сделать это - настроить два отдельных блока server {}: один для перенаправления, а другой (с каноническим именем) для фактической обработки запросов.

Пример конфигурации:

server {
    listen 80;
    listen 443 ssl;

    server_name xxx yyy.example.com $hostname;

    ssl_certificate ...
    ssl_certificate_key ...

    return 302 $scheme://xxx.example.com$request_uri;
}

server {
    listen 80;
    listen 443 ssl;

    server_name xxx.example.com;

    ssl_certificate ...
    ssl_certificate_key ...

    ...
}

Документация:

Вот вариант ансера Брентона Алкера, использующий $server_name переменная повторно использовать значение server_name директива.

    server_name primary.tld secondary.tld;
    if ($host != $server_name) {
        rewrite ^ $scheme://$server_name permanent;
    }

Или, чтобы сохранить любые параметры запроса:

    server_name primary.tld secondary.tld;
    if ($host != $server_name) {
        rewrite ^/(.*) $scheme://$server_name/$1 permanent;
    }

Вот, $server_name относится к имени основного сервера, которое является первым именем в server_name директива, а $host относится к имени хоста, указанному в HTTP-запросе.

Обратите внимание, что if в конфигурации nginx не всегда делает то, что вы ожидаете, и некоторые не одобряют его использование. Смотрите также https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

Я думаю, что что-то в этом роде должно работать:

set $primary_domain "xxx.example.com";
if ($host != $primary_domain) {
    rewrite ^ $scheme://$primary_domain permanent;
}