У меня есть три правила 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 и 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 /