Страница 1 из 2
Переезд на OkayCMS - организация redirect 301
Добавлено: 13.08.2016, 05:43
makki
Есть ли у кого-то практический опыт организации redirect 301 с старых url на новые при переезде с другой CMS на OkayCMS?
Думаю создать карту url-адресов представляющую из себя таблицу, в одной из колонок которой представлены старые адреса страниц, а во второй – соответствующие им новые адреса.
Остаётся внедрить эту карту в OkayCMS
Добавлено: 13.08.2016, 06:44
korshunov
Есть опыт. Видятся две основные возможности.
1. Создать карту вручную, и затем написать небольшой скриптик для редиректа.
2. Для карты создать в админке отдельную страницу для удобства просмотра и редактирования, на которой, в частности, сделать поиск для удобства контроля.
В обоих случаях написать небольшой скриптик для редиректа.
Добавлено: 13.08.2016, 07:52
makki
Раз есть опыт, хотелось увидеть пример реализации, поскольку я до этого сидел на другом скрипте и OkayCMS я только изучаю.
Моя идея такова. В файле index.php после строчки
добавить дополнительное условие с проверкой соответсвия $_SERVER['REQUEST_URI'] с старым адресом в карте редиректов. Если есть соответствие, сделать редирект на новый соответствующий адрес $url
Код: Выделить всё
header("HTTP/1.1 301 Moved Permanently");
header("Location: $url");
Хочется быть уверенным, что я ничего не пропустил, чтобы не потерять вес ссылок.
Добавлено: 13.08.2016, 11:30
korshunov
makki писал(а):Раз есть опыт, хотелось увидеть пример реализации
http://simpla-tuning.com/redirectsmakki писал(а):Моя идея такова. В файле index.php после строчки...
Пробуйте.
По-моему, так у Вас ничего хорошего не выйдет...
makki писал(а):Хочется быть уверенным, что я ничего не пропустил, чтобы не потерять вес ссылок.
Полную уверенность дает только страховой полис...
Добавлено: 21.08.2016, 14:33
makki
Выкладываю свое решение.
Редиректы хранятся в БД в таблице с соответствующими полями 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 после строчки
добавляем
3) В api/Managers.php в массив $permissions_list после
добавляем
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 в корне сайта перед строчкой
добавляем
Код: Выделить всё
// 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;
}
}
Добавлено: 22.08.2016, 07:05
korshunov
Сделано добротно, работает.
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 извлекать и делать редирект по нему. Не потребуется создавать новую таблицу или по крайней мере она будет существенно меньше...
Добавлено: 29.11.2017, 18:06
dimitriy
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.--?
Добавлено: 29.11.2017, 18: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($_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;
}
}
Добавлено: 30.11.2017, 09:26
dimitriy
супер, спасибо, теперь всё работает..
Добавлено: 30.11.2017, 21:29
Julius123
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($_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
Добавлено: 01.12.2017, 05:31
makki
Julius123 писал(а):У меня какая-то ошибка, например мне нужно сделать редирект с одной категории на другую и если я ставлю old_url - catalog/zhenskie-klatchi, а new_url - catalog/sumki то меня перебрасывает на неправильный URL
https://site.ru/catalog/catalog/sumki
В new_url вместо catalog/sumki пишите /catalog/sumki
Добавлено: 01.12.2017, 06:28
korshunov
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/' в оба адреса, что уж совсем плохо...
Добавлено: 01.12.2017, 06:59
makki
Тогда возникает вопрос как редиректить на главную. Я обычно в new_url ставил /
Но при вашем подходе новая ссылка при редиректе на главную будет выглядеть так site.com//
Тогда надо еще дополнительное условие
Код: Выделить всё
if($new_url=='/') {
header('Location: '.$view->config->root_url);
} else {
header('Location: '.$view->config->root_url.'/'.$new_url);
}
Добавлено: 01.12.2017, 07:14
korshunov
makki писал(а):Тогда возникает вопрос как редиректить на главную. Я обычно в new_url ставил /
Но при вашем подходе новая ссылка при редиректе на главную будет выглядеть так site.com//
Тогда надо еще дополнительное условие
Можно и так.
Я бы для этого случая прописал new_url='', то есть пустым. Такой прием применяется в админке в страницах для редактирования главной - все же некое единообразие для админа...
И вместо условия написать покороче
header('Location: '.trim($view->config->root_url.'/'.$new_url,'/'));
Добавлено: 01.12.2017, 07:37
makki
korshunov писал(а):Я бы для этого случая прописал new_url='', то есть пустым. Такой прием применяется в админке в страницах для редактирования главной - все же некое единообразие для админа...
Если new_url будет пустым, тогда не сработает условие if($new_url){
И вместо условия написать покороче
header('Location: '.trim($view->config->root_url.'/'.$new_url,'/'));
Спасибо
Добавлено: 01.12.2017, 09:45
korshunov
Да, ошибочка. У меня так работает:
Код: Выделить всё
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;
}
}
Добавлено: 03.01.2018, 11:15
makki
Добавлено: 28.11.2019, 13:46
Teplogaz
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($_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;
}
}
Добавлено: 28.11.2019, 14:29
zyxer
Тестами не прогонял по всем кейсам, но вроде работает. После установки нужно в БД в таблице ok_okaycms__redirects создавать записи. В source пишем откуда, в destination пишем куда. Так же не сложно докрутить, чтобы в админке был удобный интерфейс управления этим.
Добавлено спустя 7 минут 21 секунду:Забыл сказать, и в source и в destination пишем относительные ссылки без слеша пример:
http://prntscr.com/q3dpuv
Добавлено: 28.11.2019, 17:05
Teplogaz
zyxer можно для чайника немного подробнее объяснить?
во 2 версии я создавал таблицу ok_redirects (по инструкции выше) и вносил все ссылки, как теперь все это перенести в 3 версию