Старая версия фильтров и сортировки создавала такие ссылки (объяснение каждой части ниже - вот пример для той же категории с разными используемыми представлениями и фильтрами):
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
category
- уникальное для каждой категории название
A
- номер просматриваемой в данный момент страницы, поэтому у нас может быть, например, 10 страниц категории X - в этом случае здесь отображается 1-10 цифр
default
- определяет тип представления (сетка или список), и есть только 2 варианта: «по умолчанию» и «полный»
B
- ID сортировки (по названию, цене и т.д.), всего 4 вида сортировки (1,2,3,4)
f_
- фиксированная часть, которая появляется каждый раз, когда вы выбираете любой фильтр
filter
- определяет тип используемого фильтра, есть несколько его типов (at, производитель, цвет и т. д.)
C
- ID фильтра, здесь встречаются разные числа (1-999)
D
- Я не уверен, что делает этот номер, но он всегда появляется после части «фильтр» (в диапазоне от 1 до 99).
E
- номер неизвестен, но здесь всегда «1»
Других директив, относящихся к ссылкам на категории внутри файла .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
и конечную косую черту, поэтому конечную косую черту следует опустить в замена строка.\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