Вы можете сделать это с несколькими цепочками карта
блоки. Вот идея:
карта $arg_p $url_p {
контакт /контакт;
статический $url_id;
каталог $url_action;
# значением по умолчанию будет пустая строка
}
карта $arg_id $url_id {
карьера /карьера;
о /о;
# другие статические страницы перенаправляются на /about
по умолчанию /о;
}
карта $arg_action $url_action {
изображения $url_cat_id;
просмотр изображений $url_pid;
# другие незарегистрированные действия по умолчанию /products
по умолчанию /продукты;
}
карта $arg_cat_id $url_cat_id {
1 /категория-продукта/категория-слаг-1;
2 /категория-продукта/категория-слаг-2;
# другие неуказанные категории должны перенаправляться на /product-categories
по умолчанию /категории товаров;
}
карта $arg_pid $url_pid {
1 /продукт/продукт-слаг-1;
2 /продукт/продукт-слаг-2;
# другие товары, не включенные в список, по умолчанию /products
по умолчанию /продукты;
}
сервер {
Слушать ...
имя сервера ...
...
if ($url_p) { # если переменная '$url_p' не является пустой строкой
вернуть 301 $url_p;
}
место расположения / {
...
}
...
}
Некоторый карта
блоки можно укоротить, например, предположим, что у вас есть 3 статические страницы /карьера
, /клиенты
и страница "по умолчанию" /о
, 5 категорий и 45 товаров:
карта $arg_id $url_id {
~^(карьера|клиенты)$ /$1;
по умолчанию /о;
}
карта $arg_cat_id $url_cat_id {
~^([1-5])$ /product-category/category-slug-$1;
по умолчанию /категории товаров;
}
карта $arg_pid $url_pid {
~^([1-9]|[1-3]\d|4[0-5])$ /product/product-slug-$1;
по умолчанию /продукты;
}
Обновлять
ОП заявляет, что он не может использовать карта
директива, так как у него нет доступа к полной конфигурации nginx, а только к сервер
содержимое блока.В то время как предыдущее решение гораздо более элегантно (и должно быть более эффективным с точки зрения производительности), можно сделать то же самое, используя только если
блоки:
если ($arg_p = контакт) {возврат 301/контакт; }
if ($arg_p = static) { set $page static_$arg_id; }
если ($page = static_career) { return 301 /career; }
если ($ страница) { вернуть 301 / о; } # все, что не является 'карьерой', перенаправляется на '/about'
если ($arg_p = каталог) { установить $action $arg_action; }
если ($ действие = изображения) { установить $page category_$arg_cat_id; }
если ($page = category_1) { return 301 /product-category/category-a; }
если ($page = category_2) { return 301 /product-category/category-b; }
# ... другие категории
if ($action = images) { return 301 /product-categories; } # указана неуказанная категория
if ($action = viewimages) { установить $page product_$arg_pid; }
если ($page = product_1) { return 301 /product/product-a; }
если ($page = product_2) { return 301 /product/product-b; }
# ... другие продукты
if ($action = viewimages) { return 301 /products; } # указан не включенный в список продукт
# если вы хотите каким-то особенным образом обработать какое-либо действие, не указанное в списке
# if ($action) { ... } # 'action' аргумент запроса не 'images' или 'viewimages'
Этот фрагмент можно поместить либо в сервер
или же место расположения
контекст.