Как в NGINX элегантно написать много редиректов по ID с помощью map?

Что-то я совсем с map запутался с этими map и if.
Есть массив с более 1000 ID
100
121
34948
34
465
7741
Нужно сделать редирект такого рода

rewrite ^/cat/article/ID$ https://site.com/cat/article/postID/ permanent;

Есть ID которые нужно редиректить, допустим 5,4,55,21… нужно, а 1,2,3,4,6… уже нет. Массив содержит как раз те ID которым нужно сделать редирект.

Читал документацию, смотрел примеры. Пока надумал такой вариант
map $uri $new_uri {
…
/cat/article/100$ https://site.com/cat/article/post100/
/cat/article/121$ https://site.com/cat/article/post121/
/cat/article/34948$ https://site.com/cat/article/post34948/
…
}

server {
…
if ($new_uri) {
rewrite ^ $new_uri permanent;
. . .
}

но мне кажется он громоздким т.к. нужно прописывать весь URL. Как реализовать конфигурацию чтобы в map были прописаны только ID?
  • Вопрос задан
  • 725 просмотров
Пригласить эксперта
Ответы на вопрос 1
Lynn
@Lynn
nginx, js, css
Я бы сделал так:
map $uri $should_redirect {
  /cat/article/4 1;
  /cat/article/5 1;
  /cat/article/21 1;
  /cat/article/55 1;
  ...
}

location /cat/article/ {
  if ($should_redirect) {
    rewrite ^/cat/article/([0-9]+)$ https://site.com/cat/article/post$1/ permanent;
  }
  ...
}

Возможно перечисление внутри map нужно вынести в отдельный файл и использовать include. См. nginx.org/ru/docs/http/ngx_http_map_module.html#map.

Возможно так же надо будет подобрать новые значения для map_hash_bucket_size/map_hash_max_size. См. nginx.org/ru/docs/hash.html

Было
------------
Я не понял зачем тут map?

Чем простой rewrite плох?
location /cat/article/ {
    rewrite ^/cat/article/([0-9]+)$ https://site.com/cat/article/post$1/;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы