Назад | Перейти на главную страницу

Nginx, переписать запрос на получение

Я хотел бы переписать 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 блок, это можно считать безопасным.