Я новичок в переписывании Nginx и ищу помощь в получении рабочего и минимального кода перезаписи. Мы хотели бы использовать URL-адреса, такие как «somecity.domain.com», в материалах кампании, чтобы результаты переходили к содержанию конкретного города на сайте «www».
Итак, вот варианты использования, если клиент входит:
www.domain.com (stays) www.domain.com
domain.com (goes to) www.domain.com
www.domain.com/someuri (stays the same)
somecity.domain.com (no uri, goes to) www.domain.com/somecity/prelaunch
somecity.domain.com/landing (goes to) www.domain.com/somecity/prelaunch
somecity.domain.com/anyotheruri (goes to) www.domain.com/anyotheruri
Вот то, что я придумал, и это частично работает. Я не могу понять, как проверить, нет ли пути / uri после хоста, и я предполагаю, что, вероятно, есть способ сделать это лучше.
if ($host ~* ^(.*?)\.domain\.com)
{ set $city $1;}
if ($city ~* www)
{ break; }
if ($city !~* www)
{
rewrite ^/landing http://www.domain.com/$city/prelaunch/$args permanent;
rewrite (.*) http://www.domain.com$uri$args permanent;
}
Лучше всего это сделать с помощью трех серверов:
# www.domain.com, actually serves content
server {
server_name www.domain.com;
root /doc/root;
# locations, etc
}
# redirect domain.com -> www.domain.com
server {
server_name domain.com;
rewrite ^ http://www.domain.com$request_uri? permanent;
}
# handle anything.domain.com that wasn't handled by the above servers
server {
# ~ means regex server name
# 0.8.25+
#server_name ~(?<city>.*)\.domain\.com$;
# < 0.8.25
server_name ~(.*)\.domain\.com$;
set $city $1;
location = / { rewrite ^ http://www.domain.com/$city/prelaunch; }
location = /landing { rewrite ^ http://www.domain.com/$city/prelaunch; }
# should there be a /$city before $request_uri?
location / { rewrite ^ http://www.domain.com$request_uri?; }
}