core1024
@core1024

Как можно изменить htaccess, чтобы url дальше определенного слэша просто обрезались?

Доброго времени суток.

Есть сайт на битриксе и недавно изменилась структура каталога + перевели написание урлов на ЧПУ. Соответственно нужно настроить редирект со старых проиндексированных страниц на новые урлы.

Раньше структура была следующая:
Раздел каталога - example.com/catalog/1234
Карточка товара - example.com/catalog/1234/9876

Сейчас пока структура такая:
Раздел каталога - example.com/section/subsection/subsection_double_name (знаю, что не очень удачно, но пока так)
Карточка товара - example.com/section/subsection/item_name

Редирект сейчас осуществляется через htaccess
Приблизительно в таком виде:
redirect /catalog/1234/9876/ http://example.com/section/subsection/item_name
... и так все карточки товара, имеющиеся в момент перехода на сайте и после них разделы каталога отдельно:
redirect /catalog/1234 http://example.com/section/subsection/subsection_double_name

Но возникла проблема - если вдруг человек зашел на старую карточку товара, которую уже удалили с сайта например имеющую ID 9999 и когда-то ранее располагающуюся по адресу : example.com/catalog/1234/9999,
то в итоге переадресация срабатывает на урл такого типа:
example.com/section/subsection/subsection_double_name/9999

Вопрос - как можно сказать в htaccess, чтобы урлы дальше определенного слэша просто обрезались? Чтобы в примере приведенном выше в итоге отрабатывала переадресация на раздел.

  • Вопрос задан
  • 3002 просмотра
Решения вопроса 1
@WIBm
В документации apache (http://httpd.apache.org/docs/2.2/mod/mod_alias.html#Redirect) расписан подробно как раз данный случай:

Then any request beginning with URL-path will return a redirect request to the client at the location of the target URL. Additional path information beyond the matched URL-path will be appended to the target URL.

Example:
Redirect /service http://foo2.example.com/service

If the client requests http://example.com/service/foo.txt, it will be told to access http://foo2.example.com/service/foo.txt instead. Only complete path segments are matched, so the above example would not match a request for http://example.com/servicefoo.txt. For more complex matching using regular expressions, see the RedirectMatch directive.


Если запрашивается карточка неизвестного товара (example.com/catalog/1234/9999), то apache берет подходящее совпадение левой части URL-path (/catalog/1234/) и перенаправляет его на example.com/section/subsection/subsection_double_name/, при этом приписывая в конце оставшуюся часть начального URL (9999).

Чтобы избежать подобное поведение, нужно использовать RedirectMatch или RewriteRule вместо Redirect. Попробуйте так:
RedirectMatch ^/catalog/1234/9876/?$ http://example.com/section/subsection/item_name
RedirectMatch ^/catalog/1234/?$ http://example.com/section/subsection/subsection_double_name

Да и проставляйте код 301 (напр., "RedirectMatch 301 ^/catalog/...") для перманентного редиректа, чтобы поисковики знали что запрашиваемая страница навсегда переехала в другое место.

Ну и в конце добавьте
RewriteEngine On
RewriteRule ^catalog/([0-9]{4})/[0-9]{4}/?$ /catalog/$1 [L]
Ответ написан
Пригласить эксперта
Ответы на вопрос 2

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

Ответ написан
@WIBm
После всех редиректов добавьте следующее (mod_rewrite должен быть подключен):

RewriteEngine On
RewriteRule ^catalog/([0-9]{4})/[0-9]{4}/?$ /catalog/$1 [L]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы