У меня есть сервер 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;
}