Переезд на OkayCMS - организация redirect 301

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

makki
makki
Репутация: 164
Сообщения: 481
Зарегистрирован: 12.08.2016
С нами: 3 года 3 месяца
Откуда: Киев
Сайт Skype

Сообщение #1 makki » 13.08.2016, 05:43

Есть ли у кого-то практический опыт организации redirect 301 с старых url на новые при переезде с другой CMS на OkayCMS?

Думаю создать карту url-адресов представляющую из себя таблицу, в одной из колонок которой представлены старые адреса страниц, а во второй – соответствующие им новые адреса.

Остаётся внедрить эту карту в OkayCMS
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #2 korshunov » 13.08.2016, 06:44

Есть опыт. Видятся две основные возможности.
1. Создать карту вручную, и затем написать небольшой скриптик для редиректа.
2. Для карты создать в админке отдельную страницу для удобства просмотра и редактирования, на которой, в частности, сделать поиск для удобства контроля.

В обоих случаях написать небольшой скриптик для редиректа.

makki
makki
Репутация: 164
Сообщения: 481
Зарегистрирован: 12.08.2016
С нами: 3 года 3 месяца
Откуда: Киев
Сайт Skype

Сообщение #3 makki » 13.08.2016, 07:52

Раз есть опыт, хотелось увидеть пример реализации, поскольку я до этого сидел на другом скрипте и OkayCMS я только изучаю.

Моя идея такова. В файле index.php после строчки

Код: Выделить всё

if(($res = $view->fetch()) !== false) {
добавить дополнительное условие с проверкой соответсвия $_SERVER['REQUEST_URI'] с старым адресом в карте редиректов. Если есть соответствие, сделать редирект на новый соответствующий адрес $url

Код: Выделить всё

header("HTTP/1.1 301 Moved Permanently");
header("Location: $url");


Хочется быть уверенным, что я ничего не пропустил, чтобы не потерять вес ссылок.
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #4 korshunov » 13.08.2016, 11:30

makki писал(а):Раз есть опыт, хотелось увидеть пример реализации
http://simpla-tuning.com/redirects

makki писал(а):Моя идея такова. В файле index.php после строчки...

Пробуйте.
По-моему, так у Вас ничего хорошего не выйдет...

makki писал(а):Хочется быть уверенным, что я ничего не пропустил, чтобы не потерять вес ссылок.
Полную уверенность дает только страховой полис...

makki
makki
Репутация: 164
Сообщения: 481
Зарегистрирован: 12.08.2016
С нами: 3 года 3 месяца
Откуда: Киев
Сайт Skype

Сообщение #5 makki » 21.08.2016, 14:33

Выкладываю свое решение.
Редиректы хранятся в БД в таблице с соответствующими полями old_url и new_url. Адрес нужно добавлять без /
Например на предыдущем движке у вас категория Игрушки хранилась по адресу http://mysite.ru/category_283.html, а теперь эта категория находится по адресу http://mysite.ru/catalog/igrushki. В таком случае в поле old_url добавляем category_283.html, а в new_url - catalog/igrushki.
Готов выслушать критику и предложения.

1) В папке api создаем новый файл Redirect.php с таким содержимым:

Код: Выделить всё

<?php

require_once('Okay.php');

class Redirect extends Okay {
   
   public function get_redirect($current_uri) {   
      $query = $this->db->placehold("SELECT id, old_url, new_url FROM __redirects WHERE old_url=? LIMIT 1", $current_uri);
      if($this->db->query($query))
         return $this->db->result();
      else
         return false;
   }
}


2) В api/Okay.php в массив $classes после строчки

Код: Выделить всё

'languages'  => 'Languages',

добавляем

Код: Выделить всё

'redirect'   => 'Redirect',


3) В api/Managers.php в массив $permissions_list после

Код: Выделить всё

'languages'

добавляем

Код: Выделить всё

,'redirect'


4) Создаем новую таблицу s_redirects в БД с помощью такого запроса:

Код: Выделить всё

CREATE TABLE `s_redirects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `old_url` varchar(255) NOT NULL DEFAULT '',
  `new_url` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `old_url` (`old_url`),
  KEY `new_url` (`new_url`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


5) В файле index.php в корне сайта перед строчкой

Код: Выделить всё

if(($res = $view->fetch()) !== false) {

добавляем

Код: Выделить всё

// redirect 301
if($_SERVER['REQUEST_URI'] !== '/') {
   $current_uri = trim($_SERVER['REQUEST_URI'], '/');
   $redirect = $view->redirect->get_redirect($current_uri);
   if($current_uri == $redirect->old_url) {
      header('HTTP/1.1 301 Moved Permanently');
      header('Location: '.$redirect->new_url);
      exit;
      }
}   
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #6 korshunov » 22.08.2016, 07:05

Сделано добротно, работает.

1. Решение искусственно усложнено.
Можно было бы попроще. Если в п.5 вставить примерно так

Код: Выделить всё

if($_SERVER['REQUEST_URI'] !== '/') {
   $current_uri = trim($_SERVER['REQUEST_URI'], '/');
   $view->db->query("SELECT new_url FROM __redirects WHERE old_url=? LIMIT 1", $current_uri);
        $new_url = $view->db->result('new_url');
   if($new_url){
      header('HTTP/1.1 301 Moved Permanently');
      header('Location: '.$new_url);
      exit;
   }
}

то пп. 1,2,3 совсем не потребуются. Нет особых причин создавать функцию и класс для нее, если вызов делается только в одном месте...

2. И дополнительно к такому надо бы еще объяснять простым пользователям, как формировать новую таблицу. Думаю, у них вопросов будет предостаточно...

3. Если у Вас старые URL не совсем произвольные, а формируются по системе, то можно делать и еще проще. Если в Вашем примере старый URL category_283.html содержит ID категории, то проще этот ID извлекать и делать редирект по нему. Не потребуется создавать новую таблицу или по крайней мере она будет существенно меньше...

dimitriy
Аватара
dimitriy
Репутация: 2
Сообщения: 55
Зарегистрирован: 26.06.2016
С нами: 3 года 5 месяцев

Сообщение #7 dimitriy » 29.11.2017, 18:06

korshunov писал(а):// redirect 301
if($_SERVER['REQUEST_URI'] !== '/') {
$current_uri = trim($_SERVER['REQUEST_URI'], '/');
$redirect = $view->redirect->get_redirect($current_uri);
if($current_uri == $redirect->old_url) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.$redirect->new_url);
exit;
}
}



а работает ли это решение для линейки OKAY CMS 2.1.... ?
Я пробовал и первое решение и ваше, выдает 404, хотя все сделано по инструкции..
судя по дате, это решение может быть было для OKAY 1.--?

makki
makki
Репутация: 164
Сообщения: 481
Зарегистрирован: 12.08.2016
С нами: 3 года 3 месяца
Откуда: Киев
Сайт Skype

Сообщение #8 makki » 29.11.2017, 18:46

В какой-то из версий линейки 2.0 поменяли префикс таблиц базы данных с s_ на ok_
Поэтому вам надо его поменять в базе данных. Если не знаете как, тогда удалите таблицу s_redirects и создайте новую с помощью такого запроса.

Код: Выделить всё

CREATE TABLE `ok_redirects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `old_url` varchar(255) NOT NULL DEFAULT '',
  `new_url` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `old_url` (`old_url`),
  KEY `new_url` (`new_url`)
) ENGINE=MyISAM AUTO_INCREMENT=77 DEFAULT CHARSET=utf8;


Помимо этого, все что нужно, это как предложил korshunov в файле index.php перед строчкой

Код: Выделить всё

if(($res = $view->fetch()) !== false) {

Вставить

Код: Выделить всё

if($_SERVER['REQUEST_URI'] !== '/') {
   $current_uri = trim($_SERVER['REQUEST_URI'], '/');
   $view->db->query("SELECT new_url FROM __redirects WHERE old_url=? LIMIT 1", $current_uri);
        $new_url = $view->db->result('new_url');
   if($new_url){
      header('HTTP/1.1 301 Moved Permanently');
      header('Location: '.$new_url);
      exit;
   }
}
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS

dimitriy
Аватара
dimitriy
Репутация: 2
Сообщения: 55
Зарегистрирован: 26.06.2016
С нами: 3 года 5 месяцев

Сообщение #9 dimitriy » 30.11.2017, 09:26

супер, спасибо, теперь всё работает..

Julius123 M
Julius123 M
Репутация: 19
Сообщения: 204
Зарегистрирован: 05.02.2017
С нами: 2 года 10 месяцев

Сообщение #10 Julius123 » 30.11.2017, 21:29

makki писал(а):В какой-то из версий линейки 2.0 поменяли префикс таблиц базы данных с s_ на ok_
Поэтому вам надо его поменять в базе данных. Если не знаете как, тогда удалите таблицу s_redirects и создайте новую с помощью такого запроса.

Код: Выделить всё

CREATE TABLE `ok_redirects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `old_url` varchar(255) NOT NULL DEFAULT '',
  `new_url` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `old_url` (`old_url`),
  KEY `new_url` (`new_url`)
) ENGINE=MyISAM AUTO_INCREMENT=77 DEFAULT CHARSET=utf8;


Помимо этого, все что нужно, это как предложил korshunov в файле index.php перед строчкой

Код: Выделить всё

if(($res = $view->fetch()) !== false) {

Вставить

Код: Выделить всё

if($_SERVER['REQUEST_URI'] !== '/') {
   $current_uri = trim($_SERVER['REQUEST_URI'], '/');
   $view->db->query("SELECT new_url FROM __redirects WHERE old_url=? LIMIT 1", $current_uri);
        $new_url = $view->db->result('new_url');
   if($new_url){
      header('HTTP/1.1 301 Moved Permanently');
      header('Location: '.$new_url);
      exit;
   }
}

У меня какая-то ошибка, например мне нужно сделать редирект с одной категории на другую и если я ставлю old_url - catalog/zhenskie-klatchi, а new_url - catalog/sumki то меня перебрасывает на неправильный URL https://site.ru/catalog/catalog/sumki

makki
makki
Репутация: 164
Сообщения: 481
Зарегистрирован: 12.08.2016
С нами: 3 года 3 месяца
Откуда: Киев
Сайт Skype

Сообщение #11 makki » 01.12.2017, 05:31

Julius123 писал(а):У меня какая-то ошибка, например мне нужно сделать редирект с одной категории на другую и если я ставлю old_url - catalog/zhenskie-klatchi, а new_url - catalog/sumki то меня перебрасывает на неправильный URL https://site.ru/catalog/catalog/sumki

В new_url вместо catalog/sumki пишите /catalog/sumki
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #12 korshunov » 01.12.2017, 06:28

makki писал(а):
Julius123 писал(а):В new_url вместо catalog/sumki пишите /catalog/sumki

А вот это несколько неудобно, лучше бы примерно так
вместо
header('Location: '.$new_url);
вставить
header('Location: '.$view->config->root_url.'/'.$new_url);

А если вдруг CMS установлена не в корень домена, а в папку site.ru/folder/, то писать каждый раз имя папки - совсем нехорошо...
И кстати, метод не будет корректно работать вообще в этом случае, придется приписывать '/folder/' в оба адреса, что уж совсем плохо...

makki
makki
Репутация: 164
Сообщения: 481
Зарегистрирован: 12.08.2016
С нами: 3 года 3 месяца
Откуда: Киев
Сайт Skype

Сообщение #13 makki » 01.12.2017, 06:59

Тогда возникает вопрос как редиректить на главную. Я обычно в new_url ставил /
Но при вашем подходе новая ссылка при редиректе на главную будет выглядеть так site.com//
Тогда надо еще дополнительное условие

Код: Выделить всё

      if($new_url=='/') {
         header('Location: '.$view->config->root_url);   
      } else {
         header('Location: '.$view->config->root_url.'/'.$new_url);   
      }
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #14 korshunov » 01.12.2017, 07:14

makki писал(а):Тогда возникает вопрос как редиректить на главную. Я обычно в new_url ставил /
Но при вашем подходе новая ссылка при редиректе на главную будет выглядеть так site.com//
Тогда надо еще дополнительное условие

Можно и так.

Я бы для этого случая прописал new_url='', то есть пустым. Такой прием применяется в админке в страницах для редактирования главной - все же некое единообразие для админа...

И вместо условия написать покороче
header('Location: '.trim($view->config->root_url.'/'.$new_url,'/'));

makki
makki
Репутация: 164
Сообщения: 481
Зарегистрирован: 12.08.2016
С нами: 3 года 3 месяца
Откуда: Киев
Сайт Skype

Сообщение #15 makki » 01.12.2017, 07:37

korshunov писал(а):Я бы для этого случая прописал new_url='', то есть пустым. Такой прием применяется в админке в страницах для редактирования главной - все же некое единообразие для админа...
Если new_url будет пустым, тогда не сработает условие if($new_url){

И вместо условия написать покороче
header('Location: '.trim($view->config->root_url.'/'.$new_url,'/'));
Спасибо
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #16 korshunov » 01.12.2017, 09:45

Да, ошибочка. У меня так работает:

Код: Выделить всё

if($_SERVER['REQUEST_URI'] !== '/') {
   $current_uri = trim($_SERVER['REQUEST_URI'], '/');
   $view->db->query("SELECT new_url FROM __redirects WHERE old_url=? LIMIT 1", $current_uri);
   if($res = $view->db->result()){
      header('HTTP/1.1 301 Moved Permanently');
      header('Location: '.trim($view->config->root_url.'/'.$res->new_url,'/'));
      exit;
   }
}

makki
makki
Репутация: 164
Сообщения: 481
Зарегистрирован: 12.08.2016
С нами: 3 года 3 месяца
Откуда: Киев
Сайт Skype

Сообщение #17 makki » 03.01.2018, 11:15

Cоздание и расширение функционала интернет-магазина на платформе OkayCMS

Teplogaz
Teplogaz
Репутация: 2
Сообщения: 20
Зарегистрирован: 27.11.2017
С нами: 2 года

Сообщение #18 Teplogaz » 28.11.2019, 13:46

makki писал(а):В какой-то из версий линейки 2.0 поменяли префикс таблиц базы данных с s_ на ok_
Поэтому вам надо его поменять в базе данных. Если не знаете как, тогда удалите таблицу s_redirects и создайте новую с помощью такого запроса.

Код: Выделить всё

CREATE TABLE `ok_redirects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `old_url` varchar(255) NOT NULL DEFAULT '',
  `new_url` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `old_url` (`old_url`),
  KEY `new_url` (`new_url`)
) ENGINE=MyISAM AUTO_INCREMENT=77 DEFAULT CHARSET=utf8;


Помимо этого, все что нужно, это как предложил korshunov в файле index.php перед строчкой

Код: Выделить всё

if(($res = $view->fetch()) !== false) {

Вставить

Код: Выделить всё

if($_SERVER['REQUEST_URI'] !== '/') {
   $current_uri = trim($_SERVER['REQUEST_URI'], '/');
   $view->db->query("SELECT new_url FROM __redirects WHERE old_url=? LIMIT 1", $current_uri);
        $new_url = $view->db->result('new_url');
   if($new_url){
      header('HTTP/1.1 301 Moved Permanently');
      header('Location: '.$new_url);
      exit;
   }
}


Подскажите как это реализовать в OkayCMS 3
В частности куда вставить этот код

Код: Выделить всё

if($_SERVER['REQUEST_URI'] !== '/') {
   $current_uri = trim($_SERVER['REQUEST_URI'], '/');
   $view->db->query("SELECT new_url FROM __redirects WHERE old_url=? LIMIT 1", $current_uri);
        $new_url = $view->db->result('new_url');
   if($new_url){
      header('HTTP/1.1 301 Moved Permanently');
      header('Location: '.$new_url);
      exit;
   }
}

zyxer M
zyxer M
Возраст: 28
Репутация: 37
Сообщения: 177
Зарегистрирован: 03.02.2016
С нами: 3 года 10 месяцев
Откуда: Днепр

Сообщение #19 zyxer » 28.11.2019, 14:29

Тестами не прогонял по всем кейсам, но вроде работает. После установки нужно в БД в таблице ok_okaycms__redirects создавать записи. В source пишем откуда, в destination пишем куда. Так же не сложно докрутить, чтобы в админке был удобный интерфейс управления этим.

Добавлено спустя 7 минут 21 секунду:
Забыл сказать, и в source и в destination пишем относительные ссылки без слеша пример: http://prntscr.com/q3dpuv
Вложения
Redirects_for_OkayCMS_3.zip
(2.32 КБ) 14 скачиваний
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

Teplogaz
Teplogaz
Репутация: 2
Сообщения: 20
Зарегистрирован: 27.11.2017
С нами: 2 года

Сообщение #20 Teplogaz » 28.11.2019, 17:05

zyxer можно для чайника немного подробнее объяснить?

во 2 версии я создавал таблицу ok_redirects (по инструкции выше) и вносил все ссылки, как теперь все это перенести в 3 версию


Название раздела: Полезные решения для OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


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

   

Вернуться в «Полезные решения для OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя