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

Перенаправление старых специфических фильтров на базовый URL категории

Старая версия фильтров и сортировки создавала такие ссылки (объяснение каждой части ниже - вот пример для той же категории с разными используемыми представлениями и фильтрами):

https://example.com/category-one/1/default/1/f_at_175_3/1
https://example.com/category-two/1/full/3/f_at_185_1/1
https://example.com/category-three/1/default/1/f_at_175_3/1/f_producer_7/1
https://example.com/category-name-and-size-40x40/1/default/1/f_at_175_3/1/f_producer_7/1

Нам нужно перенаправить их на новую ссылку:

https://example.com/category1/1/

Вот мой код. Когда я использую инструменты "htaccess checker", когда я использую флаг "R = 301" - возникает ошибка, как показано ниже - так можно ли вообще использовать 301 в этом случае ?:
«Неверная строка: RewriteRule недопустима, содержит ли она пробел в шаблоне или подстановке?»

RewriteEngine on
RewriteRule ^([a-z0-9-]+)/[0-9]{1,2}/(default|full)/[1-9](/f_[A-Za-z]+_[0-9]{1,3}(_[0-9]{1,2})?/1)+/?$ /$1/ [R=301, L]

подробная информация:

Вот структура этих ссылок:

https://example.com/category/A/default/B/f_filter_C_D/E

Других директив, относящихся к ссылкам на категории внутри файла .htaccess, нет.

RewriteRule ^([a-z0-9-]+)/[0-9]{1,2}/(default|full)/[1-9](/f_[A-Za-z]+_[0-9]{1,3}(_[0-9]{1,2})?/1)+/?$ /$1/ [R=301, L]

Эта директива «недействительна», потому что она содержит пространство в RewriteRule флаги (3-й) аргумент [R=301, L] - так должно быть [R=301,L]. Пространства являются разделителями в .htaccess, так что это по существу разбивает третий аргумент на два. (Ошибка, сообщаемая этим инструментом, в лучшем случае не была строго правильной или расплывчатой.)

Однако вы не захватываете второй сегмент пути, т.е. 1 (или A в твоем структурная разбивка). Итак, это перенаправит на /category1/не /category1/1/, как в вашем примере.

В противном случае ваша директива / регулярное выражение кажется в порядке.

Вместо этого попробуйте следующее в верхней части .htaccess файл.

RewriteRule ^([\w-]+/\d{1,2}/)(default|full)/\d(/f_[a-zA-Z]+_\d{1,3}(_\d{1,2})?/1)+$ /$1 [R=302,L]

Дополнительные замечания:

  • В $1 обратная ссылка теперь включает A и конечную косую черту, поэтому конечную косую черту следует опустить в замена строка.
  • Я удалил необязательную завершающую косую черту в шаблоне, так как ее нет в ваших примерах URL или в вашем описании формата URL.
  • Я использовал сокращенный класс символов \w чтобы соответствовать категория. Это соответствует A-Z и _ в дополнение к указанным вами иероглифам, но он немного короче.
  • я использовал \d вместо того [0-9][1-9]) - чуть короче.

Перед тестированием вам необходимо очистить кеш браузера. Сначала проверьте 302 (временные) перенаправления, чтобы избежать ошибочных проблем с кешированием.

ОБНОВИТЬ: Кажется (из комментариев), что «номер страницы» (2-й сегмент пути) должен составлять часть собственного параметра URL-адреса в целевом URL-адресе (а не дополнительный сегмент пути, следующий из категория), поэтому это нужно фиксировать отдельно. И похоже, что косая черта в конце не требуется.

Итак, это следует изменить на:

RewriteRule ^([\w-]+)/(\d{1,2})/(default|full)/\d(/f_[a-zA-Z]+_\d{1,3}(_\d{1,2})?/1)+$ /$1?page=$2 [R=302,L]

Вам также нужно будет добавить QSA флаг, если может существовать дополнительная строка запроса, которую необходимо передать на целевой URL.

Правильно, я не упомянул, что названия категорий также содержат - - нет _. Somteimes также есть номера размеров. Я редактировал свои примеры в предыдущем посте.

Кроме того, я забыл о перенаправлении на конкретный номер страницы, поэтому вот новая версия:

RewriteEngine on
RewriteRule ^([a-z0-9-]+)/(\d{1,2})/(default|full)/[1-9](/f_[A-Za-z]+_\d{1,3}(_\d{1,2})?/1)+/?$ /$1?page=$2 [R=301,L]

Итак, теперь мы перенаправляемся с:
/ имя-категории-40x40 / 16 / по умолчанию / 1 / f_producer_41 / 1 / f_at_173_23 / 1
кому:
/ category-name-40x40? page = 16