Редирект с url товара с категорией на без категории на OpenCart
Из данной статьи вы узнаете как реализовать редирект 301 со страницы товара с категорией на страницу товара без категории на CMS OpenCart 4 (проверено на 4 версии OpenCart, должно работать и на прошлых версиях).
Многие кто создавал свой собственный интернет-магазин на CMS OpenCart сталкивались с такой проблемой, что URL-адрес страницы товара имел такой вид:
- https://product/категория/товар
- https://product/товар/категория
- https://product/категория/подкатегория/товар
- https://product/товар/категория/подкатегория
Разные ссылки на один и тот-же товар могут создавать дубли страниц, что негативно сказывается на поисковой оптимизации.
В данной статье мы рассмотрим, как я привёл все ссылки на товары к такому виду: https://product/товар. Все остальные виды ссылок на товар, которые я указал выше при проверке, будут выдавать код ответа сервера "301 Moved Permanently".
- Проверить какой код выдаёт страница вашего сайта, вы можете здесь: Проверить ответ сервера на ЯндексВебмастер.
Даную проблему я решил таким образом:
-
В контроллере по пути "\catalog\controller\product\product.php"
в файле product.php добавить после кода:
$data['column_left'] = $this->load->controller('common/column_left');
$data['column_right'] = $this->load->controller('common/column_right');
$data['content_top'] = $this->load->controller('common/content_top');
$data['content_bottom'] = $this->load->controller('common/content_bottom');
$data['footer'] = $this->load->controller('common/footer');
$data['header'] = $this->load->controller('common/header');вот этот код: (это примерно 517 строка, у вас может быть по другому)
if (isset($this->request->get['path'])) {
$this->response->redirect($this->url->link('product/product', '&product_id=' . $this->request->get['product_id']));
}
Примерно это должно выглядеть так:

И после этого в файле response.php (путь: system/library/response.php), найти код "public function redirect(string $url, int $status = 302): void {
header('Location: ' . str_replace(['&', "\n", "\r"], ['&', '', ''], $url), true, $status);"
заменить значение "int $status = 302" на значение 301. Т.е. вместо кода ответа сервера 302 поставить код 301.
Файл response отвечает за формирование и отправку HTTP-ответа клиенту. Обычно он включает в себя следующие элементы:
- Код состояния HTTP (например, 200 для успешного запроса, 404 для страницы не найдена и т. д.).
- Заголовки (headers), такие как Content-Type, Cache-Control, Cookies и т. д.
- Тело ответа (например, HTML-код страницы или JSON-ответ).
После всех этих манипуляций проверьте правильно ли у вас срабатывает редирект 301. Эти действия мне помогли избавиться от лишних дублей страниц.
- Кстати тег "canonical" формирует правильный вид ссылки: https://product/товар
Смотрим наглядный пример:
На данном скриншоте приведён код ответа сервера "200 OK", т.е. вид ссылки, который мы хотим видеть.

- На следующем скриншоте мы видим код ответа "301 Moved Permanently". Тот же товар, но в ссылке присутствует категория (подкатегория) в начале ссылки:

- И последний скриншот показывает код отвера "301 Moved Permanently", но категория (подкатегория) в ссылке уже в самом конце:

Если вам помогла данная статья, не забываем посетить наш интернет-магазин: Tchepuha.ru