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

Как предотвратить конфликт правил RewriteRules

У меня есть три правила RewriteRule, которые я пытаюсь реализовать, но не могу заставить все 3 работать вместе:

RewriteRule ^products$ http://%{SERVER_NAME}/en_ca/products [L,R=301]

RewriteRule ^products/(.*)$ http://%{SERVER_NAME}/en_ca/$1 [L,R=301]

RewriteRule ^products/(.*)/(.*)$ http://%{SERVER_NAME}/en_ca/$2 [L,R=301]

Я пытаюсь достичь следующего:

  1. www.domain.com/products> www.domain.com/en_ca/products
  2. www.domain.com/products/product-name> www.domain.com/en_ca/product-name
  3. www.domain.com/products/cat/product-name> www.domain.com/en_ca/product-name

Я могу заставить работать 1 и 2, но 2 мешает работать 3. Есть ли способ убедиться, что URL-адрес состоит из трех частей, или есть лучший способ сделать это?

Спасибо

# rule 1
RewriteRule ^products/?$ /en_ca/products [L,R=301]
# rule 2
RewriteRule ^products/([^/]+)/?$ /en_ca/$1 [L,R=301]
# don't use this one since it would allow for greater than 2 /
# products/cat/cat_food/diners will write: en_ca/cat_food/diners
# RewriteRule ^products/(.*)/(.+)$ /en_ca/$2 [L,R=301]
# rule 3
# to be extra careful to only include 2 /, do it this way:
RewriteRule ^products/([^/]+)/([^/]+)/?$ /en_ca/$2 [L,R=301]

Это должно сработать. Не используйте жадный. * (Что угодно, включая /), используйте ограничивающий [^ /] * (что угодно, кроме /, то есть). Также безопаснее изменить *, ноль или больше, на +, которое равно 1 или больше.

Я считаю, что у вас может быть ошибка в другом месте, чтобы посмотреть, что здесь происходит:

Правило 1: возьмите только / products и измените его на: en_ca / products. Все последующие действия не сработают, потому что теперь путь начинается с en_ca. Вы можете избавиться от: http: //%Кстати, {SERVER_NAME} в перезаписи. / en_ca / 1 $ достаточно.

Правило 2: возьмите / products / product_name и перепишите его в: / en_ca / product_name. Теперь никакое другое правило не изменит его, потому что оно больше не начинается с продуктов.

Правило 3 сработает только в том случае, если путь содержит 2 / и начинается с продуктов, поэтому ни правило 1, ни правило 2 не могут создать URL-адрес, который будет перезаписан третьим правилом.

Добавление /? (0 или 1 косая черта в конце) защищает вас также от людей, которые входят в / products / или products / product_name /