Блок пользователя
Регистрация на нашем сайте позволит вам общаться на форумах и получить доступ к другому полезному функционалу
Вы вошли как Гость

Реализуем переход с раздела на поддомен

  • 90 просмотров
  • 14 мая, 2024
  • Обновлено: 24 мая, 2024
  • admin
  • Время чтения: 6 минут
  • 1 (Подробно)

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

Зачем мне нужен поддомен?

В обычной ситуации с сайтом среднего объема и не имеющим проблем с индексацией поддомены действительно вам не понадобятся. Лично у меня такая задача какое-то время уже присутствует не менее чем в трех проектах. Причина заключается в SEO и в том, как поисковики в отдельных случаях могут проявлять излишний интерес к отдельным разделами или даже страницам.

В одном из проектов посадочные страницы под самые важные поисковые запросы я оформлял в виде пустых разделов. Зачем? Дело в том, что менее важные посадочные я реализовал через раздел system с использованием плагина System by Alias. В результате работа с контентом систематизировалась и упростилась.

В один прекрасный момент я стал замечать, что один из разделов начал получать необычно большое количество просмотров. Вроде бы и хорошо, но проблема заключалась в том, что услуга, под которую оптимизировался данный раздел, являлась второстепенной и скорее сопутствующей. Прямых конверсий сама по себе она не давала, хотя трафик привлекала заметный.

Как поисковые системы могли бы трактовать такое положение дел? С уверенностью сказать сложно, можно лишь предположить что этот перекос мог бы вызвать нежелательное позиционирование злосчастной услуги сайта в качестве основной. Ну а как еще если в отдельные дни на этот раздел приходилось до четверти посещений?

В результате родилось решение о реализации функционала по трансформации ссылок с раздела на поддомен. Алгоритм работы примерно следующий:

  1. Настраиваем соответствующую A-запись (записи) и создаем целевой сайт на поддомене (поддоменах).
  2. Создаем и загружаем файл кастомных функций, которые будут отвечать за трансформацию ссылок на разделы и страницы в них. Необходимо лишь ограничить их применение “препарируемым” разделом (или разделами).
  3. Настраиваем плагин URL Editor для использования данных функций.
  4. Решаем вопрос 301 редиректов.

Все не так страшно, как выглядит. Но обо все по порядку.

Создание сайта на поддомене

Здесь конкретных рекомендаций у нас не будет. В моем случае я просто взял за основу результирующий HTML-код проблемного раздела. Навигацию удалил, стили и скрипты оставил только необходимые. Единственный важный момент – правильно разместить две вещи:

  • обратную ссылку на сайт;
  • ссылки-мотиваторы на важные коммерческие страницы основного сайта.

Это важно, поскольку наша задача состоит в том, чтобы не только увести “лишний” трафик с основного сайта, но и заставить его работать в его поддержку. По крайней мере, пусть хотя бы отдает свой вес – ведь поддомен формально это отдельный сайт.

Подгрузка кастомных функций

В Cotonti Siena присутствует интересный функционал, позволяющий достаточно высоко загружать пользовательские функции. Для этого в папке system необходимо создать файл functions.custom.php и в файле настроек config.php включить его использование:

$cfg['customfuncs'] = false;	// Includes file named functions.custom.php

Сам файл имеет следующий вид:

<?php
/**
* Custom functions library
*/

defined('COT_CODE') or die('Wrong URL');

$subdomain_areas = array('problema1', 'problema2', 'problema3');

/**
* Changes  to / for List URLS
*
* @param array $args Args passed over from cot_url
* @return string
*/

function list_url_structure(&$args) {
  global $structure, $sys, $subdomain_areas;

  $catpath = explode('.', $structure['page'][$args['c']]['path']);
  $root_cat = array_shift($catpath);

  if (in_array($root_cat, $subdomain_areas)) {
    // Make the URL absolute and exclude root cat
    $subdomain = $root_cat;
    $path = implode('/', $catpath);
    $url = $sys['scheme'] . '://' . $subdomain . '.' . $sys['domain'] . '/' . $path;
  } else {
    $url = str_replace('.', '/', $structure['page'][$args['c']]['path']);
  }
  
  unset($args['c']);
  unset($args['e']);
  return $url;
}

/**
* Changes to / for Page URLS
*
* @param array $args Args passed over from cot_url
* @return string
*/

function page_url_structure(&$args) {
  global $structure, $sys, $subdomain_areas;

  (empty($args['c'])) && $args['c'] = 'system';

  $catpath = explode('.', $structure['page'][$args['c']]['path']);
  $root_cat = array_shift($catpath);

  if (in_array($root_cat, $subdomain_areas)) {
    // Make the URL absolute and exclude root cat
    $subdomain = $root_cat;
    $path = implode('/', $catpath);
    (!empty($path)) && $path .= '/';
    $url = $sys['scheme'] . '://' . $subdomain . '.' . $sys['domain'] . '/' . $path;
  } else {
    $url = str_replace('.', '/', $structure['page'][$args['c']]['path']) . '/';
  }

  if ($args['id']) {
    $url .= $args['id'];
    unset($args['id']);
  } elseif ($args['al']) {
    $url .= rawurlencode($args['al']);
    unset($args['al']);
  }

  unset($args['c']);
  unset($args['e']);
  return $url;
}

Трансформируемые в поддомены разделы указываем в массиве $subdomain_areas. Далее идут две функции: list_url_structure() и page_url_structure(). Если на поддомен переводится пустой раздел (как у меня), вторую функцию можно закомментировать.

Разделы, ссылки на которые мы будем изменять, записываем в массив $subdomain_areas. В нашем примере это разделы с кодами problema1, problema2 и problema3.

Настройка плагина URL Editor

Функции у нас есть. Теперь необходимо их применить. Мы сделаем это через соответствующую конфигурацию плагина URL Editor – коробочного расширения Cotonti Siena, отвечающего за переписывание URL’ов. Для этого в папке plugins/urleditor/presets разместим файл subdomains.dat следующего содержания:

page m=*				page?m={$m}
page c=system&al=*		{$al}{!$c}
page c=all				page
page c=*&al=*			{page_url_structure()}
page c=*&id=*			{page_url_structure()}
page c=*				{list_url_structure()}
tags a=all&t=*			{$_area}/{$t}{!$a}
tags a=*&t=*			{$_area}/{$a}/{$t}
tags t=*				{$_area}/{$t}
index *					{$_path}
plug e=*				{$e}
plug *					{$_path}
users m=details&u=*		users/{cot_url_username()}
users m=register		{$m}
users m=profile			{$m}
users m=passrecover		{$m}
login *					{$_area}
message *				{$_area}
admin m=*				admin/{$m}
admin *					{$_area}
rss m=*&c=*				{$_area}/{$m}/{$c}
rss m=*&id=*			{$_area}/{$m}/{$id}
rss c=*					{$_area}/{$c}
rss m=*					{$_area}/{$m}
* c=*&al=*				{$_area}/{cot_url_catpath()}/{$al}
* c=*&id=*				{$_area}/{cot_url_catpath()}/{$id}
* c=*					{$_area}/{cot_url_catpath()}
* al=*					{$_area}/{$al}
* id=*					{$_area}/{$id}
* *						{$_area}

Для эстетики откорректируем в файле локализации urleditor.ru.lang.php переменную $L[‘cfg_preset_params’]:

$L['cfg_preset_params'] = 'subdomains: Поддомены, handy: Удобный, compat: Совместимый с Genoa/Seditio, custom: Собственный urltrans.dat, none: Отключено';

Теперь все красиво. Остался последний вопрос.

Настраиваем 301 редиректы

Важно понимать, что только что мы просто переписали ссылки для выбранных разделов. При переходе по старой ссылке вы ожидаемо получите ошибку “URL не найден”. Надеюсь, что кастомную 404-страницу для этого вы уже создали. Это хорошо, но вопрос передачи веса на поддомен пока не решается. Для этого необходимо настроить редиректы 301:

Запрошенный ресурс на постоянной основе перемещен в новое местоположение.

В моем случае я ограничился тем, что в плагин проекта добавил часть с хуком input. Это самый высокорасположенный в системе хук, что позволяет нам реализовывать пользовательский функционал уже после загрузки только самых жизненно необходимых данных.

Код может выглядеть примерно так:

<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=input
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL.');

$req_path = "https://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

$pos = 'some_substring';

if (strpos($req_path, $pos) !== false) {
	header("HTTP/1.1 301 Moved Permanently");
	header("Location: " . "https://subdomain.site.tld");
	exit();
}

В результате при попытке обращения по старому адресу, клиент до загрузки сайта будет перенаправлен на поддомен. Соответственно, и посещение будет зафиксировано только для целевого поддомена, минуя исходный раздел.

Конечно, если вы переносите раздел с вложенными страницами или даже подразделами, все будет немного сложнее. Тем не менее, эта задача не из разряда невыполнимых.

Заключение

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

Пока же мы успешно переписали ссылки с раздела на поддомен, решили вопрос с перенаправлениями со старого адреса (в том числе из текстовых полей) и кратко обсудили нюансы создания мини-сайта на поддомене. Никаких модификаций в существующем сайте делать не нужно – ни в шаблонах модуля Page, ни в шаблонах использующих его расширений. Например, в плагине Catlist.

Если у вас есть чем поделиться по данной теме, используйте комментарии или пишите на форумах.

Ранее я рассказывал об использовании плагина Attach2 в шаблоне правки страницы.

Аватар

1. spectre

  • 20.05.2024 23:00

Спасибо за подробное описание. Был вопрос по реализации переноса отдельной страницы на поддомен, но пока не очень актуально. А с разделами действительно интересно: все ссылки глобально переписываются, и нет необходимости в ручной работе. Вес должен корректно перетечь.

Новый комментарий

Имя:
Для редактирования комментария осталось 10 минут