Я хотел бы переписать URL из
/shop/?category=kitset-kitchens
к
shop/category/kitset-kitchens
Что пробовал:
rewrite ^/shop.*$ /shop/category/$arg_category permanent;
goes to:
shop/category/kitset-kitchens?category=kitset-kitchens
если я поставлю "?" вот так:
rewrite ^/shop.*$ /shop/category/$arg_category? permanent;
goes to:
shop/category/
Я пробовал поиграть с переменными, но результат тот же. Как только для $ args установлено значение '', все остальные переменные будут пустыми, в противном случае он добавляет запрос на получение в конце URL-адреса. Что я делаю не так?
Я бы не хотел использовать условия
Не уверен, что браузер примет во внимание параметры запроса после кеширования перенаправления. Это означает, что после того, как браузер выполнит перенаправление с /shop/?category=kitset-kitchens
к /shop/category/kitset-kitchens
один раз он перенаправит вас на ту же страницу, даже если category
параметр запроса будет иметь другое значение. Разные браузеры могут вести себя по-разному, поэтому этот предмет требует некоторого тестирования.
Возвращаясь к вопросу, для очистки category
параметр запроса, сохраняющий все остальные, которые вы можете использовать
location = /shop/ {
if ($args ~ (.*)(^|&)category=[^&]*(\2|$)&?(.*)) {
# preserve 'category' parameter value
set $category $arg_category;
# remove 'category' parameter from query string
set $args $1$3$4;
# rewrite URI or do redirection
rewrite ^ /shop/category/$category break;
}
# if you need to pass the request to an upstream, use
proxy_pass http://upstream$uri$is_args$args;
}
Обратите внимание, что с этой конфигурацией веб-адрес в браузере пользователя не изменится с example.com/shop/?category=kitset-kitchens
к example.com/shop/category/kitset-kitchens
(здесь используется только внутренняя перезапись). Вы можете попробовать перенаправление (изменить break
флаг rewrite
директива к permanent
), но, как я уже сказал, эта конфигурация требует тестирования в различных браузерах из-за возможных проблем с кешированием. Вы также можете попробовать временное перенаправление (используйте redirect
флаг для этого).
Вы сказали, что не хотите использовать условия, но поскольку нет других директив, кроме set
и rewrite
внутри if
блок, это можно считать безопасным.