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

Как удалить дефис (-) с помощью правила перезаписи nginx?

Я использую это правило перезаписи для перенаправления

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Подробнее постоянный