Я использую это правило перезаписи для перенаправления
example.com/a-b-c?id=learn-more ----> http://example.com/abc?id=learnmore
rewrite ^/a-b-c?id=learn-More http://example.com/abc?id=learnMore permanent
Но это не работает !! Он перенаправляется на
example.com/abc?id=learn-more ("узнать больше" не преобразуется в "узнать больше").
Как этого добиться?
Если у вас есть только один (или, возможно, несколько) из них, которые точно соответствуют, вы можете проверить аргумент явно.
if ($arg_id = "learn-More"} {
return 301 $scheme://$http_host$uri?id=learnMore
}
Вы не можете сопоставить строки запроса в nginx rewrite
директива. Вам нужно сделать что-то вроде этого:
location ~* /(?<p1>[a-z]+)-(?<p2>[a-z]+)-(?<p3>[a-z]+) {
if ($args ~ id=(?<q1>[a-z]+)-(?<q2>[a-z]+)) {
rewrite ^ http://example.com/$p1$p2$p3?id=$q1$q2 permanent;
}
}
Здесь мы используем захват регулярных выражений для захвата частей URL-адреса между дефисами к различным переменным nginx (p1
, p2
и p3
) ?<p1>
после (
означает, что совпадение должно быть сохранено в p1
переменная.
Затем, если блок местоположения совпадает, мы пытаемся сопоставить строку запроса ($args
в nginx), если он содержит два слова, разделенных тире. Если совпадение найдено, детали сохраняются в q1
и q2
.
Наконец, мы выполняем реальную перезапись, используя захваченные части.
Вам нужно будет избежать? в регулярном выражении; в его нынешнем виде это означает, что c не является обязательным.
Попробуйте: перепишите ^ / a-b-c \? Id = learn-More http://example.com/abc?id=learnПодробнее постоянный