Nginx - обслуживание множества редиректов с помощью Nginx map
"Ткнул" в гугле, а получил 404 "страница не найдена", почему так?
Когда мы обновляем сайт, то возможно меняем адреса страниц и разделов, но поисковики продолжают выдавать в поиске старые страницы. Клиенты переходят на них из результатов поиска, получают ошибку 404.
Пользователь недоволен и уходит с сайта не разбираясь. Также сайт падает в рейтинге поисковика и как следствие в поисковой выдаче.
Выход из данной ситуации логичен - нужен 301 (перманентный = постоянный) редирект на новый адрес страницы.
Предположим, у нас был раздел /nashy-raboty и мы сменили его адрес на /portfolio (что более логично и понятнее), но наша CMS не обеспечивает перенаправление со старого адреса на новый. 
Выход - использовать редиректы на уровне веб сервера Nginx
Редирект в Nginx "в лоб"
В конфиге своего сайта мы можем написать что-то вроде
server {
# Тут про имя сервера и порт
location /nashy-raboty {
  return 301 /portfolio;
}
# Тут целевые локации вашего приложения
}И это будет работать, при переходе на старый url пользователь будет перекинут на новый и он увидит, то что хотел.
Роботы поисковиков зафиксируют 301 редирект (страница перемещена навсегда) и учтут это в своей индексации.
А если надо сделать 100500 редиректов?
Очевидно, что при большом количестве редиректов обслуживать конфигурацию nginx будет непросто и утомительно
Выход использовать конструкцию map
map $request_uri $redirected_url {
  default "none";
  /nashy-raboty /portfolio;
  /work /works; 
}
server {
# Тут про имя сервера и порт
if ($redirected_url != "none") {
	rewrite ^ $redirected_url permanent;
	}
# Тут целевые локации вашего приложения
}Как это работает?
map $uri $redirected_url {
  default "none";
  /nashy-raboty /portfolio;
  /work /works; 
}Задавать значение для переменной $redirected_url в зависимости от значения в переменной $uri
$uri - встроенная переменная nginx которая содержит хвост запроса пользователя
Получается, если запрос будет на /nashy-raboty, то в $redirected_url запишется значение /portfolio аналогично для второго правила с /work -> /works если соответствия в map найдено не будет, то используется default = "none"
if ($redirected_url != "none") {
	rewrite ^ $redirected_url permanent;
	}Далее, если $redirected_url отличается от значения по умолчанию, то надо выполнить редирект на URL записанный в значении переменной $redirected_url