Регулярное выражение перезаписи URL nginx, когда URL содержит определенное слово, но не другое

Пожалуйста, рассмотрите следующие URL.

  1. https://products.example.com/family/child
  2. https://products.example.com/products/family/child
  3. https://products.example.com/family/children
  4. https://products.example.com/products/family/children

Среди четырех я должен перенаправить один следующим образом: https://products.example.com/family/children

Это означает, что я хочу перенаправить URL-адреса, которые не содержат слово /products/ а также /children, Если URL не содержит слова /products/ но содержат /child в конце мне нужно заменить /child с /children,

ОБНОВЛЕНИЕ 1: у меня есть 2 проблемы, как показано ниже.

  1. Определите URL, который нужно заменить.
  2. Измените указанный URL-адрес, как требуется.

Я могу определить URL с этим регулярным выражением, но не могу заменить.

Обновление 2: я думаю, что нашел способ идентифицировать: ^(?!.*\/products(?:\/))(?:(.*)\/|$)?(?:child)$ и заменить: $1/children

Следующая проблема: регулярное выражение работает с опцией /m только. Может ли это быть изменено, чтобы работать без него как:

rewrite ^(?!.*\/products(?:\/))(?:(.*)\/|$)?(?:child)$ $1/children permanent;

1 ответ

Нечто подобное должно работать для того, что вы сказали выше, однако ваш вопрос не так точен, как мог бы, и это может быть не совсем то, что вы хотите.

= Означает точное совпадение. Удалите его, и я думаю, вы получите совпадение подстроки. Вы можете прочитать документацию для деталей.

location = /family/child {
  return 301 http://www.example.com/family/children;
}
Другие вопросы по тегам