Скажем, у меня есть несколько вариантов доменного имени, один имя бренда зарегистрированы в нескольких доменах верхнего уровня; и все они должны перейти в один конкретный домен + добавить специальный пользовательский uri, относящийся к первоначально запрошенному домену.
Например, у меня есть:
куда domain.com это тот, где все запросы должны приземляться после добавления дополнительного uri, например:
Я придумал эту рабочую установку:
# (www.)domain.tld
server {
listen 80;
server_name domain.tld www.domain.tld;
return 301 $scheme://www.domain.com/tld$request_uri;
}
# (www.)domain.net
server {
listen 80;
server_name domain.net www.domain.net;
return 301 $scheme://www.domain.com/net$request_uri;
}
# (www.)domain.org
server {
listen 80;
server_name domain.org www.domain.org;
return 301 $scheme://www.domain.com/org$request_uri;
}
# (www.)domain.com
server {
listen 80;
server_name domain.org www.domain.org;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend.host:port;
}
}
Но объявление нескольких сервер блоки, хотя и логичны, выглядят слишком многословными.
TL; DR Есть ли способы выполнить такое перенаправление без необходимости определять сервер блокировать для каждого домена?
Регулярное выражение server_name
Директива может захватывать последний элемент доменного имени для использования в перенаправлении. Например:
server {
listen 80;
server_name ~\.(?<tld>[^.]+)$;
return 301 $scheme://www.domain.com/$tld$request_uri;
}
Видеть этот документ для подробностей.