Суть задачи:
есть сайт на OpenCart, точнее даже на ocStore версии 2.1.0.2.1, по сути эти движка одинаковы, отличия могут быть в каких-нибудь плюшках, не суть важно. На сайте настроен SeoPro так что при переходе на ссылку товара, в урле которого нет категории, идет редирект 302 на урл товара с категорией.
Например
при открытии ссылки товара
/apple-ipad-10-2-wi-fi-32gb-silver-mw752
идет редирект 302 на ссылку товара с категорией ipad
/ipad/apple-ipad-10-2-wi-fi-32gb-silver-mw752
Так вот в данном случае нужен редирект 301
Варианты решения проблемы с редиректом
на опенкаре все редиректы в основном используют метод redirect
$this->response->redirect($url);
Метод принадлежит классу Response
путь к файлу: /system/library/response.php
Открываем файл и видим следующую картину репина
. . . public function redirect($url, $status = 302) { header('Location: ' . str_replace(array('&', "\n", "\r"), array('&', '', ''), $url), true, $status); exit(); } . . .
Оказывается у метода есть доп параметр, который обычно упускают, это status
Вариант 1
исправляем статус по умолчанию на 301
Вариант 2
исправляем везде где встречается вызов метода redirect и где нам нужен именно 301 редирект
на строчку примерно такого вида
$this->response->redirect($url,301);
конечно вместо $url должна стоять та переменная которая и использовалась.
вообще достаточно только в файле seo_pro.php исправить.
Вариант n
написать модуль для редиректа, заплатить кому-нибудь чтоб сделали тоже самое, купить модуль который по сути будет делать тоже самое, и т.д. и т.п.
То что осталось за кадром
просматривая код seo_pro.php (возможно он был уже кем то модифицирован)
нашел такие строчки
if (rawurldecode($url) != rawurldecode($seo)) { header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently'); $this->response->redirect($seo); }
то есть, злой гений все-таки хотел сделать редирект 301, и перед вызовом метода $this->response->redirect добавил ответ 301, НО сцуко не учли что метод потом затер тот ответ и поставил свой 302.
Почему я так думаю, ну может это чисто моя фантазия, а нет, я проверял это на деле, что собственно может сделать каждый.
Спасибо за инфу!