Re: Редирект на необходимый урл в том случае если запрос включает параметры и соответствует паттерну

Gena Makhomed gmm на csdoc.com
Пт Ноя 4 16:58:54 UTC 2016


On 04.11.2016 16:15, sysadm wrote:

> У меня довольно странный вопрос, не могу что-то нагуглить похожую проблему.
> Если мне надо организовать обычный редирект с одного урла на другой в
> котором просто категории или human-readable линк я поступаю так:
> rewrite ^(/56184-example-link-to-redirect-79e3100/)$ /target/link
> permanent;
>
> Но в последнее время владелец ecommerce хочет делать редиректы типа:
>
> rewrite ^(/example-category?collection=collection-name&filter=filter-var1)$
> /target/link permanent;
>
> причем после знака ? идёт иногда один параметр или два как в примере выше, а
> иногда гораздо больше. Я прекрасно понимаю и транслирую владельцу сервиса,
> что параметры могут меняться местами. Ему пофиг, поскольку где-то в гугле
> закешировалось и фигурирует в таком виде. Соответственно надо заставить
> нгинкс распознавать весь урл как одно целое. К сожалению для nginx всё что
> идет после знака ? это массив с аргументами и на каждый такой массив надо
> было бы клепать костыли с кучей if-ов с учётом каждого параметра по
> отдельности. С учётом того, что подобных редиректов мне приходит список на
> пару сотен - сделать что-то подобное руками - нереально. Парсить и генерить
> конфигурацию с частоколом if-ов тоже не айс. Что делать, граждане дорогие?
> Можно как-то сломать поведение нгинкса, чтобы он без лишнего анализа и
> разбора параметров в $ARG сделал то что я хочу?

В модуле http://nginx.org/ru/docs/http/ngx_http_core_module.html

есть переменная

$request_uri - первоначальный URI запроса целиком (с аргументами)

дальше http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html

if ( $request_uri ~ 
"/example-category?collection=collection-name&filter=filter-var1" ) {
     return 301 /target/link permanent;
}

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru