Страницы в корне сайта на ICMS2

#1 24 июля 2014 в 22:10
Когда-то тут была подобная тема. Но сейчас я её не нашёл, поэтому создал новую. К модератору: если та тема не скрыта, перенесите это соощение в неё.

По теме. Стандартными способами в Двойке невозможно сделать страницы в корне сайта (с адресом типа site.ru/page.html) без указания типа контента в адресе. В некоторых случаях это создаёт проблемы при разработке. Зато можно попробовать вариант с заменой части адреса в htaccess. Идея в том, чтобы создать тип контента, который будет использоваться для подобных страниц. Назвать его, например, root. И потом в htaccess написать правила для RewriteRule, чтобы если в адресе есть строка '.html', то есть расширение с точкой, указывающее, что запрашивается страница, а не раздел, и при этом на втором и далее местах в строке отсутствует слеш '/', то есть, запрашиваемая страница находится в корне, тогда перед адресом страницы после домена сайта добавляем 'root/'
То есть, если приходит URI вида /page.html, то меняем его на /root/page.html. Естественно, делать это не редиректом, чтобы для пользователя адрес остался прежним, в корне сайта.

Особенности варианта:
1. Страницы должны быть только одного типа контента. В большинстве случаев этого хватает.
2. В htaccess нужно менять REQUEST_URI, так как все запросы страниц и раделов перенаправляются на index.php, а ядро потом определяет реальный адрес по REQUEST_URI.

У меня не хватает знаний по htaccess, сходу сделать так не получилось. Может кто-то сможет реализовать идею? Если это возможно, конечно.

Если это невозможно, тогда остаётся только хак ядра, что не очень хорошо.
Как вариант для разработчиков InstantCMS 2 для будущих версий, можно будет сделать опцию в настройках, где админ сможет указать тип контента, который будет использоваться в случае, если запрашивается страница без типа, то есть, страница из корня сайта.
#2 26 июля 2014 в 02:41
Долго мучился с .htaccess ничего так и не получилось, вероятно из за структуры разбора URI движком инстанта...
Но вопрос можно решить хаком. Дописываем в файле \system\core\core.php в функции route($uri) на 574 строке вместо:
  1.  
  2. // Определяем контроллер из первого сегмента
  3. if (isset($segments[0])) { $this->uri_controller = $segments[0]; }
  4.  
  5. // Определяем действие из второго сегмента
  6. if (isset($segments[1])) { $this->uri_action = $segments[1]; }
  7.  
  8. // Определяем параметры действия из всех остальных сегментов
  9. if (sizeof($segments)>2){
  10. $this->uri_params = array_slice($segments, 2);
  11. }
  12.  
следующее:
  1.  
  2. // Добавляем проверку на количество передаваемых параметров...
  3. if (sizeof($segments)==1) { // Если оказался один параметр, предполагаем что это статическая страница
  4.  
  5. $this->uri_controller = 'pages'; // жестко вписываем имя контроллера
  6. $this->uri_action = $segments[0]; // и передаем аргумент
  7.  
  8. } else { // в противном случае работаем как и задумано
  9.  
  10. // Определяем контроллер из первого сегмента
  11. if (isset($segments[0])) { $this->uri_controller = $segments[0]; }
  12.  
  13. // Определяем действие из второго сегмента
  14. if (isset($segments[1])) { $this->uri_action = $segments[1]; }
  15.  
  16. // Определяем параметры действия из всех остальных сегментов
  17. if (sizeof($segments)>2){
  18. $this->uri_params = array_slice($segments, 2);
  19. }
  20.  
  21. }
  22.  
#3 26 июля 2014 в 12:38
Спасибо, Val, хак работает. Страницы доступны и по сокращённому адресу (в корне сайта), и по старому полному. При этом остаётся возможность редактировать и удалить страницы обычным способом.

Решение найдено. В принципе, можно было бы закрывать тему. Но подожду немного, может кто-то сможет сделать то же самое через .htaccess. Мне кажется, что для непрограммистов менять что-то в .htaccess проще, чем в скриптах. Да и при обновлении системы хаки теряются и их нужно делать заново.
#4 26 июля 2014 в 15:08

Да и при обновлении системы хаки теряются и их нужно делать заново.

WebMan
Если вам нужно "не стандартное" поведение системы, вам придется изменять Ядро и следующие обновления проводить в ручном режиме.
У меня просто вопрос: Какая разница между mysite.ru/page.html и mysite.ru/page/page.html?
С точки зрения SEO-оптимизации — разницы никакой. А вот когда проект подрастет и наполнится контеном, когда вы в него вложите Н-челочасов, случайно обновится и развалится сайт — в это время вы пожалеете что придумали подобные не нужные изменения.
#5 26 июля 2014 в 15:32
Вы по-своему правы, sofcom, любые нестандартные вещи на сайте в будущем могут создать проблемы. Но ведь это не повод для отказа от них, если это нужно, верно? Вместо этого можно поискать наиболее простые и надёжные варианты решения, что мы сейчас и делаем
А задачи бывают разные. Иногда заказчики хотят видеть страницы в корне сайта, иногда переводится на новую CMS существующий сайт с сохранением старых страниц по их прежним адресам. Да мало ли какие нужды бывают. Поэтому лучше иметь возможность выбора как сделать желаемое, чем не иметь её.

С точки зрения СЕО — спорный вопрос. Все современные поисковики прекрасно переваривают и выводят в выдачу страницы с любыми адресами, даже без ЧПУ. Но адреса с ЧПУ нагляднее, в том числе и для пользователей в результах выдачи. И как по мне, так некоторые адреса в корне смотрятся лучше. Например, site.ru/about.html в корне выглядит проще и понятнее, чем site.ru/pages/about.html в непонятном разделе pages. Это моё субъективное восприятие, конечно. Каждый воспринимает по-своему. Но и это тоже вполне подходящая причина иметь возможность выбора разных вариантов для разных пользователей.
#6 26 июля 2014 в 16:18

Например, site.ru/about.html в корне выглядит проще и понятнее, чем site.ru/pages/about.html в непонятном разделе pages.

WebMan
Я у себя на сайте решил поменять pages на info, с помощью стандартного механизма iCMS2, о котором рассказывал r2. Получится site.ru/info/about.html, в моем случае вполне приемлемо))
#7 26 июля 2014 в 16:37
Ага, это решает задачу для новых сайтов. Я тоже буду стараться делать таким образом. Но для обновления CMS на старых это не всегда подойдёт. Хотя и там можно обойтись без хака, понаделывать 301-х редиректов в .htaccess, если страниц немного.
#8 26 июля 2014 в 17:56
В хаке ошибочку нашел zst. Нужно дополнительно проверять, что вызывается html страница, а не просто считать количество передаваемых параметров )). В противном случае не будут работать ссылки типа sitename.ru/activity или sitename.ru/posts.
Вот исправленная версия:
  1.  
  2. if (sizeof($segments)==1 && strripos($segments[0], '.html') !== false) {
  3.  
  4. $this->uri_controller = 'pages';
  5. $this->uri_action = $segments[0];
  6.  
  7. } else {
  8.  
  9. // Определяем контроллер из первого сегмента
  10. if (isset($segments[0])) { $this->uri_controller = $segments[0]; }
  11.  
  12. // Определяем действие из второго сегмента
  13. if (isset($segments[1])) { $this->uri_action = $segments[1]; }
  14.  
  15. // Определяем параметры действия из всех остальных сегментов
  16. if (sizeof($segments)>2){
  17. $this->uri_params = array_slice($segments, 2);
  18. }
  19.  
  20. }
  21.  
#9 26 июля 2014 в 18:08
Спасибо за исправление Val! Проверил. Таки да, активность без исправления не работала. Теперь всё нормально. 😊
#10 28 июля 2014 в 17:52
WebMan, Может я что-то неправильно понял, но у меня все нормально открывается, без всяких:
nashaliga.com.ua/onlytime.html — тут я записываю среднее время загрузки страницы
#11 28 июля 2014 в 19:39
Александр, не совсем понятно про что именно Вы написали? Если Вы пишите про "Активность" на указанном Вами сайте, то да, она работает, и возникает вопрос: применяли ли Вы хак из этой темы и если да, то первый или второй вариант?
Пишите подробнее, пожалуйста. Вас будет легче понять.
Что касается указанной Вами странички, то судя по её коду она открывается в обход движка ICMS, напрямую с диска. Хак тут непричём.
#12 29 июля 2014 в 18:42
WebMan, А, всё, я таки понял о чем тема. Да, я просто залил страницу в корень сайта. Если говорить по теме — то я пожалуй бы выбрал вариант с htaccess файлом
#13 13 августа 2014 в 19:55
кто подскажет, как создавать страницы в корне сайта v2.0… вида /page.html?
#14 13 августа 2014 в 20:14
Для lezginka.ru. Страницы в корне сайта v2.0 пока можно делать только хаком от Val, описанным им в этой теме в #8. Способ без хака пока не нашли.
Этот хак все страницы в корне сайта считает страницами с типом контента 'pages'. То есть, site.ru/about.html в корне — это на самом деле страница site.ru/pages/about.html. Таким образом можно сделать сколько угодно страниц с типом 'pages' и потом поделать ссылки на них из корня, без папки с категорией.
#15 6 сентября 2014 в 23:57
Тоже начал смотреть это, тут при обновлении движка core.php 100% слетит, что не есть хорошо, а вот механизм который R2 заложил по переименовыванию ссылок в файле ../system/config/remap.php можно попробовать использовать docs.instantcms.ru/manual/settings/rewriting, нужно написать функцию в этом файле которая скажет, что /pages/ => на корень сайта, нужно сначала написать перменую корня сайта, а потом сказать что /pages/ => /$home ну как то так мое видение этого дела…
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.