Меню

Чпу битрикс 404 ошибка

 

Пользователь 1255065

Заглянувший

Сообщений: 32
Баллов: 1
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 07.07.2017

Проблема проста. Чувствую что решается за пять минут, но пока ни как не пойму куда копать. Нужно чтоб URL были вида

https://site.org/catalog/nazvanie_tovara.html

Что я делала. В настройках компанента написала

URL страницы информационного блока: #SITE_DIR#/catalog/
URL страницы раздела: #SITE_DIR#/catalog/#SECTION_CODE#/
URL страницы детального просмотра: #SITE_DIR#/catalog/#ELEMENT_CODE#.html

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

https://site.org/catalog/kod_razdela/cod_tovara/

Тоесть выходит что оно берет вид этих ссылок откуда-то еще, но сколько читала, всюду написано что именно тут. Кэш сбрасывала, не помогает. Решила чтоб на верняка попробовать настроить еще в самом компаненте. Открыла каталог, включила режим правки, и там вкомпаненте прописала тоже самое. сами ссылки на странице поменялись, стали такимикак я хотела, но они же не работают, работают те старые. Что я еще не учла? Если что то и в управлении адресами добавляла правило #^catalog/(.*).html$#, но и оно не помагало. буду благодарна за любую подсказку.

 

Пользователь 265297

Постоянный посетитель

Сообщений: 112
Баллов: 11
Авторитет:

0

Рейтинг пользователя:

0

Регистрация: 11.05.2015

Обычно это все прописывается в настройках инфоблока и затем дублируется в настройках компонента и ЧПУ работает. Разве нет?

 

Пользователь 1255065

Заглянувший

Сообщений: 32
Баллов: 1
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 07.07.2017

#3

0

07.07.2017 00:51:54

Цитата
Андрей написал:
Обычно это все прописывается в настройках инфоблока и затем дублируется в настройках компонента и ЧПУ работает. Разве нет?

Вот и я так думала. А нет. Я прописала так как нам нужно, но работает старый тип ссылок, а новые выдают ошибк 404.

 

Пользователь 90886

Эксперт

Сообщений: 2453
Баллов: 228
Авторитет:

41

Рейтинг пользователя:

1

Регистрация: 24.05.2011

#4

0

07.07.2017 01:53:23

Добрый вечер.

В настройках инфоблока как обычно:

Код
URL страницы информационного блока:   #SITE_DIR#/catalog/
URL страницы раздела:   #SITE_DIR#/catalog/#SECTION_CODE#/
URL страницы детального просмотра:   #SITE_DIR#/catalog/#ELEMENT_CODE#.html

В настройках компонента тоже как обычно:

Код
Включить поддержку ЧПУ: да
Каталог ЧПУ (относительно корня сайта): /catalog/
Раздел:   #SECTION_CODE#/
Детальная информация: #ELEMENT_CODE#.html

При этом нужно проверить, чтобы в шаблонах компонентов вывод ссылок был правильный, т.е.

Код
<a href="<?=$arItem['DETAIL_PAGE_URL']?>">

Самописное правило из обработки адресов удалите, а затем еще раз откройте настройки компонента и сохраните — если там отмечена галочка использования ЧПУ, Битрикс в этот момент сам прописывает правило обработки адресов.

Это все, больше никаких настроек не нужно, все должно работать. Если нет — пишите, попытаемся разобраться почему не работает.

Бесплатные консультации по Битриксу | Исправление ошибок на сайте, решение сложных проблем

 

Пользователь 1255065

Заглянувший

Сообщений: 32
Баллов: 1
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 07.07.2017

#5

0

07.07.2017 08:38:46

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

Код
<?
$curArray = explode('/', $_SERVER['REQUEST_URI']);


if((int)count($curArray) == 4 || (strpos($_SERVER['REQUEST_URI'], '/catalog/') !== false && (int)count($curArray) == 3))
    $isSection = true;
else
    $isSection = false;

if (($isSection && $curArray[2] != '') || (isset($_REQUEST['KLEMM']) && $_REQUEST['KLEMM'] != '')) {   // проверка существования тегирования
    $arCurFilterSection = array(
        'IBLOCK_ID' => 18,
        'ID' => $curArray[2],
        'ACTIVE' => 'Y',
        'UF_TAGGING' => 1
    );
    if (isset($_REQUEST['KLEMM']) && $_REQUEST['KLEMM'] != '') {
        unset($arCurFilterSection['ID']);
        $arCurFilterSection['CODE'] = $_REQUEST['KLEMM'];
    }
    $rsCurSection = CIBlockSection::GetList(array(), $arCurFilterSection, false, array('IBLOCK_ID', 'IBLOCK_SECTION_ID', 'ID', 'CODE', "UF_TAGGING"), false);
    if ($tag = $rsCurSection->Fetch()) {
        if ($tag["IBLOCK_SECTION_ID"] != 1946){
            $res = CIBlockSection::GetByID($tag["IBLOCK_SECTION_ID"]);
            if($ar_res = $res->GetNext())
                $parent = $ar_res['CODE'];
            if ($parent != ''){
                $arCurGet = explode('?',$APPLICATION->GetCurPageParam('', array('KLEMM','SECTION_CODE','clear_cache')));
                LocalRedirect('/catalog/'.$parent.'/'.$tag['CODE'].'/'.($arCurGet[1]?'?'.$arCurGet[1]:''), false, 301);
            }
        }
    }
}
if((int)count($curArray) == 5)
    $isElement = true;
else
    $isElement = false;
?>

<?

if(count($curArray) > 5 && count($_POST) == 0) {
    CHTTP::SetStatus("404 Not Found");
    @define("ERROR_404","Y");

} ?>

 

Пользователь 1255065

Заглянувший

Сообщений: 32
Баллов: 1
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 07.07.2017

#6

0

07.07.2017 13:54:41

Попробовала создать новую страничку, по тойже схеме. Там если настроить так как в курсах написано и как тут писалось то работает. Значит это правда в этом куске что я привела все происходит, но только не пойму почему тогда если закоментировать строки с

Код
 CHTTP::SetStatus("404 Not Found");
    @define("ERROR_404","Y");


то редерикт на 404 остается.И вот что еще. Сейчас попробовала допустить умышленно ошибку вкоде, то тогда вместо 404 крашится с ошибкой, тоесть настройка работает, осталось подружить это все с самим компанентом.

Блин. Наверно не понятно написала, сама запуталась, а до понедельника край как нужно сделать, в понедельник выгрузку товаров уже делать. Помогите… :(

 

Пользователь 90886

Эксперт

Сообщений: 2453
Баллов: 228
Авторитет:

41

Рейтинг пользователя:

1

Регистрация: 24.05.2011

Напишите, пожалуйста,  адрес сайта где можно увидеть проблему.

 

Пользователь 1255065

Заглянувший

Сообщений: 32
Баллов: 1
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 07.07.2017

#8

0

07.07.2017 14:57:55

Цитата
Денис Сон написал:
Напишите, пожалуйста,  адрес сайта где можно увидеть проблему.

Он пока на локалхосте. Страшный мэнаджер решил что лучше чтоб все было отлажено и настроено, а уж потом на основной домен выгружать.

 

Пользователь 90886

Эксперт

Сообщений: 2453
Баллов: 228
Авторитет:

41

Рейтинг пользователя:

1

Регистрация: 24.05.2011

Я в этом шаманском коде не понимаю пока, для чего нужен LocalRedirect. Попробуйте его закомментировать — проблема, скорее всего уйдет. Но нужно разбираться, для чего этот код нужен был и как его сделать нормальным.

 

Пользователь 1255065

Заглянувший

Сообщений: 32
Баллов: 1
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 07.07.2017

#10

0

07.07.2017 15:08:54

Цитата
Денис Сон написал:
опробуйте его закомментировать — проблема, скорее всего уйдет.
Цитата
Наталия Курилович написал:
но только не пойму почему тогда если закоментировать строки с

Не уйдет.  

 

Пользователь 90886

Эксперт

Сообщений: 2453
Баллов: 228
Авторитет:

41

Рейтинг пользователя:

1

Регистрация: 24.05.2011

#11

0

07.07.2017 15:10:45

Вы пробовали закомментировать одновременно и LocalRedirect и CHTTP::SetStatus(«404 Not Found») и @define(«ERROR_404″,»Y»), и после этого проблема остается?

 

Пользователь 1255065

Заглянувший

Сообщений: 32
Баллов: 1
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 07.07.2017

#12

0

07.07.2017 15:17:42

Ой. Нет. Но это тоже не оно. Но и это не помогло. Это было выдран из другого проэкта, это я знаю зачем. Там мы по тем же граблям ходили, правда уже на боевом сайте и нужно было чтоб яндекс не ругался на то что страницы безследно исчезли мы их так перемещали. Там проверка идет по каким-то условиям, особо не вникала, я на том сайте мало чего делаю, так вот идет проверка и если такой товар есть то его редериктет на новый урл с кодом перемещено на всегда. Тут это не нужно, убрала этот блок. Пока по старому. Разделы находит, а товары сейчас уже ни по старому ни так ка надо не открывает. Кажется уже почти разобралась. Там нужно немного подправить. Точно, нашла, сейчас попробую.

 

Пользователь 1255065

Заглянувший

Сообщений: 32
Баллов: 1
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 07.07.2017

#13

0

07.07.2017 21:26:49

Не то.Проблема актуальна. Думаю что проще в htaccess правила прописать и не мучаться.  

 

Пользователь 508049

Заглянувший

Сообщений: 34
Баллов: 1
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 01.02.2017

#14

0

19.10.2018 22:42:41

Цитата
Наталия Курилович написал:
Не то.Проблема актуальна. Думаю что проще в htaccess правила прописать и не мучаться.  

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

1С-Битрикс — правильная настройка страницы 404

 

Пользователь 405991

Заглянувший

Сообщений: 3
Авторитет:

1

Рейтинг пользователя:

0

Регистрация: 04.11.2015

#15

0

10.10.2019 15:53:54

Цитата
Александр Лыженков написал:

Цитата
Наталия Курилович  написал:
Не то.Проблема актуальна. Думаю что проще в htaccess правила прописать и не мучаться.  

Вот верная настройка 404 страницы, специально написали эту статью, чтобы раз и навсегда закрыть эту тему, так как это одна из самых распространенных ошибок:1С-Битрикс — правильная настройка страницы 404

Простите за некрофилию) Статья в поиске была.
Не мог убрать ошибку 404 после склеивания двух сайтов в мультисайтовую конфигурацию.
Мне помогла ручная правка urlrewrite.php в корне дополнительного сайта.
Ссылка на сообщение:

https://dev.1c-bitrix.ru/support/forum/messages/forum6/topic65993/message346806/#message346806

В моем случае ошибка 404 была из-за того, что новые компоненты новостей НЕ добавили свои правила в urlrewrite.php.
Я их дописал вручную (заодно пронумеровал массив по порядку и убрал пропуски)

Всем привет.
Проблема: со включённым ЧПУ на странице детального просмотра новости текст новости не выводится.
Для вывода новостей использую комплексный компонент bitrix.news.
Список новостей выводится по адресу: bitrix-biz.com/novosti
С выключенным ЧПУ ссылка на новость детально имеет вид: http://bitrix-biz.com/novosti/?ELEMENT_ID=%ID%
где %ID% — идентификатор новости.
С включённым ЧПУ ссылка на новость детально имеет вид: http://bitrix-biz.net/novosti/%ID%/
где %ID% — идентификатор новости.

Настройки инфоблока:

Настройки ЧПУ компонента:

urlrewrite.php в корне сайте для новостей есть такая запись:

array (
    'CONDITION' => '#^/novosti/#',
    'RULE' => '',
    'ID' => 'bitrix:news',
    'PATH' => '/novosti/index.php',
    'SORT' => 100,
  )

С выключенным ЧПУ в компоненте всё работает: и страница «список новостей», и страница «новость детально».
С включённым ЧПУ в компоненте на странице «новость детально» текст новости не отображается.

Помогите правильно настроить ЧПУ компонента bitrix.news. Можно ли это сделать только через gui (без «ковыряния в коде»)?

.htaccess в корне сайта:

Options +Indexes 
ErrorDocument 404 /404.php

<IfModule mod_php5.c>

  php_flag session.use_trans_sid off
  
  php_value display_errors 1
  
  php_value mbstring.func_overload 2
  php_value mbstring.internal_encoding UTF-8
  
  php_value max_input_vars 10000
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_REFERER} http://bot.net/
    RewriteRule .* http://bitrix-biz.net [R=301,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php [L,QSA]
</IfModule>

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
  RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
  RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
</IfModule>

<IfModule mod_dir.c>
  DirectoryIndex index.php index.html
</IfModule>

qna.habr.com

Не работает 404 ошибка в 1с битрикс. Правильная настройка

В битриксе 404 ошибка отрабатывается весьма специфически — неправильный адрес со статических страниц и разделов корректно перебрасывает на страницу 404.php, при этом сохраняя неправильный URL в адресной строке браузера. То есть все по seo.

А вот если неправильный адрес начинается с раздела инфоблока или каталога, то сервер отдаст браузеру 404 статус страницы (и то при определенных настройках инфоблока, о которых ниже), но 404 страницу не покажет, а покажет корневую страницу инфоблока, причем иногда совсем другого инфоблока. Но все-таки сохранит неправильный URL в адресной строке.

В интернете данный вопрос поднимался не раз. Когда-то популярным решением была настройка в битрикс принудительного редиректа на 404 страницу.))) Перечитав изрядно статей, выполнив несколько найденных инструкций, желаемого результата добиться не удалось(((. Пришлось, вооружившись командой print backtrace, отловить негодяйскую 404 ошибку и заставить ее работать как положено.

Ставим задачу:

  1. Нужно, чтобы инфоблоки и каталоги в случае неправильной ссылки отдавали 404 статус
  2. Нужно, чтобы этот статус правильно обрабатывался и приводил к вызову страницы 404.php

На что стоит обратить внимание:

1. Файл 404.php — лежит в корне сайта. Должен выглядеть вот так (тут все стандартно):

<? if ($_SERVER[‘DOCUMENT_URI’] == «/404.php») {

$_SERVER[‘REQUEST_URI’] = $_SERVER[‘DOCUMENT_URI’];

}

include_once($_SERVER[‘DOCUMENT_ROOT’].’/bitrix/modules/main/include/urlrewrite.php’);

CHTTP::SetStatus(‘404 Not Found’);

@define(‘ERROR_404’, ‘Y’);

require($_SERVER[«DOCUMENT_ROOT»].»/bitrix/header.php»);

$APPLICATION->SetTitle(«Страница не найдена»); ?>  

ТУТ ТЕКСТ ВСЯКИЙ

<? require($_SERVER[«DOCUMENT_ROOT»].»/bitrix/footer.php»); ?>

2. В .htaccess должна быть вот такая строчка:

ErrorDocument 404 /404.php

Если у вас сервер на nginx, то нужно прописать в конфиге, в секции location, следующее:

error_page 404 = /404.php;

тех. отступление:

Попробуем сэмулировать 404 ошибку с какой-нибудь статической страницы и отловить результат через команду debug_print_backtrace();

Skrinshot-2015-01-01-14.35.46

Смотрим файл — видим там строку с инклюдом 404 страницы. Она вызывается, очевидно, в том случае, если страница не найдена в структуре файлов и папок, а также в файле urlrewrite.php в корне сайта, где как раз описаны все наши инфоблоки и каталоги (для правильной работы ЧПУ).

Первая поставленная нами задача выполняется настройкой инфоблоков и компонентов:

3. Проверим настройки самих каталогов:

Скриншот 2015-01-01 14.56.00

URL страницы ИБ — должен указывать на папку, из которой будет осуществляться вызов инфоблока.

URL страницы раздела — если структура инфоблока будет иметь подразделы, то ссылка должна строиться на основе символьного кода раздела.

URL страницы детального просмотра — если элемент находится в подразделе, то к ссылке будет прибавляться символьный код раздела перед символьным кодом элемента. Иначе — только символьный код элемента.

4. И инфоблоков:

Скриншот 2015-01-01 15.48.25

то есть, как мы видим, для инфоблоков подразделы можно не описывать.

5. Проверяем настройки вызова инфоблоков:

Скриншот 2015-01-01 15.22.18

Обязательно проверяем, что отмечена галка «Включить поддержку ЧПУ»!

Каталог ЧПУ — корневая папка инфоблока

Раздел — #SECTION_CODE#/ — повторяем из настроек инфоблока, но не ставим слеш в начале, иначе компонент будет работать не верно

Детальная информация — #SECTION_CODE#/#ELEMENT_CODE#/ —  ссылка формируется на основе символьного кода раздела (если есть) и кода элемента. Опять же, слеш в начале не ставим!

Если предполагается, что все элементы будут располагаться в корне инфоблока, без подразделов, то можно использовать следующие настройки:

Скриншот 2015-01-01 15.49.27

То есть поле для страницы раздела вообще можем пропустить , для страницы элемента: #ELEMENT_CODE#/ . Не забываем пропустить слеш в начале!

6. Отмечаем галочку там же в настройках: «Устанавливать статус 404, если не найдены элемент или раздел:».

тех. отступление:

После сохранения всех настроек, если мы набираем в разделе инфоблока неправильный адрес, то по-прежнему вместо 404 страницы увидим корневую страницу раздела инфоблока, но страница будет иметь в заголовке 404 статус. Посмотреть его можно через браузерную панель разработчика:

Скриншот 2015-01-01 15.26.32

Этим мы и воспользуемся, а чтобы данный статус правильно обрабатывался

7. Добавим следующий код в файл /bitrix/php_interface/init.php:

<?

AddEventHandler(‘main’, ‘OnEpilog’, ‘_Check404Error’, 1);

function _Check404Error(){

if (defined(‘ERROR_404’) && ERROR_404 == ‘Y’) {

global $APPLICATION;

$APPLICATION->RestartBuffer();

include $_SERVER[‘DOCUMENT_ROOT’] . SITE_TEMPLATE_PATH . ‘/header.php’;

include $_SERVER[‘DOCUMENT_ROOT’] . ‘/404.php’;

include $_SERVER[‘DOCUMENT_ROOT’] . SITE_TEMPLATE_PATH . ‘/footer.php’;

}

}

?>

С этого момента страница ошибок будет работать! (наверно))) Если нет, опишите вашу ситуацию в комментариях

UPD от 29.08.15: чуть обновил код файла 404.php  и сниппет для init.php

UPD от 15.01.18: настраивал сегодня на одном проекте отладку 404-й ошибки по данной инструкции. Все работает отлично)) Версия битрикса — последняя на указанную дату

romapad.ru

Настройка ЧПУ в 1С-Битрикс | Для разработчиков

Самый главный файл в 1С-Битрикс для настройки ЧПУ это urlrewrite.php, который находиться в корневой папке вашего сайта. В нем прописаны правила обработки адресов. Эти правила также создаются в админке сайта на странице «Настройка правил обработки адресов» по следующему пути
Настройки ->Настройки продукта -> Обработка адресов -> Правила обработки
ваш сайт/bitrix/admin/urlrewrite_list.php?lang=ru 
Но как правила вручную эти адреса не прописывают их указывают в настройках компонента или инфоблока

При сохранение компонента создаются правила в urlrewrite.php, для этого вы должны корректно настроить ЧПУ в настройках компонента в режиме правки

Для не комплексного компонента создать правила сложнее, их скорее всего придется править вручную в файле. Ниже код правила, позволяющий открывать страницы в которых могут быть любые буквы и цифры. Также обратите внимание на .* в конце, эта точка и звездочка нужна для того, что бы корректно открывать адреса с GET переменными, например когда после сохранения страницы у вас появляется параметр /?clear_cache=Y 
Если не указать эти символы в конце, то отобразится 404 ошибка, т.е. страница или раздел не будут найдены. 

  1. <?

  2. $arUrlRewrite = array(

  3. array(

  4. "CONDITION" => "#^/catalog/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/.*#",

  5. "RULE" => "SECTION_CODE=$1&ELEMENT_CODE=$2",

  6. "ID" => "",

  7. "PATH" => "/catalog/detail.php",

  8. ),

  9. array(

  10. "CONDITION" => "#^/catalog/([a-zA-Z0-9-]+)/.*#",

  11. "RULE" => "SECTION_CODE=$1",

  12. "ID" => "",

  13. "PATH" => "/catalog/list.php",

  14. ),

  15. );

  16. ?>

Правило для комплексного компонента создается автоматически, после сохранения компонента, править вручную его не нужно:

  1. <?

  2. $arUrlRewrite = array(

  3. array(

  4. "CONDITION" => "#^/news/#",

  5. "RULE" => "",

  6. "ID" => "bitrix:news",

  7. "PATH" => "/news/index.php",

  8. ),

  9. );

  10. ?>

Загрузка

site05.ru

Как не надо разрабатывать проект на Битрикс / Habr

За все время своей работы с Битрикс мне довелось поработать с очень большим количеством проектов, которые кто-то разрабатывал до меня. Тут и мелкие доработки, фикс различных багов и ошибки работы логики, редизайн сайта и глобальные изменения существующего функционала. И, как и любой другой разработчик, я терпеть не могу разгребать чужой мусор, костыли и «временные» заплатки, которые на деле помнят еще 8 редакцию продукта.

Здесь я постараюсь не акцентировать внимание на стандартных «worst practice» при программировании на PHP, типа наплевательского отношения к выборам имен переменных и функций, излишних запросов к БД в цикле, отсутствия проверок пользовательских данных в формах, игнорирование комментариев и тому подобного. Я попытаюсь коснуться именно моментов, свойственных разработке на Битриксе, которые в последствии позволят избежать негодования и проклятий в ваш адрес от программиста, которому выпало сопровождать ваш код. И да, нередко этим программистом будете оказываться вы сами через год, или более, когда уже совершенно забудете, зачем вы вставляли сюда тот или иной костыль.

«Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте» (с) Джон Ф. Вудс

Первое, и самое, на мой взгляд, важное — ради всего святого, используйте папку local. Это просто жизненно необходимо при использовании системы контроля версий – все, что вам нужно – добавить в исключения папку /bitrix/. Всё. Далее практически вся разработка ведется только в ней. Это заметно упрощает поиск нужных файлов и компонентов в последствии, помогает не засорять репозиторий лишними файлами, да и вообще – приводит дерево проекта в более опрятный, «человеческий» вид.

Не модифицируйте ядро. Даже если вы уверены, что оно не будет обновляться. Даже если так быстрее. Даже если вам лень. Забудьте эту мысль, как страшный сон. Если необходимо изменить логику работы стандартного компонента – перенесите его в новое пространство имен /local/components/modify/ и работайте с ним. То же самое касается модулей, гаджетов и activities бизнес-процессов.

Не засоряйте файл init.php. Объединяйте функции для работы с каким-то конкретным модулем или функционалом в класс, весь этот класс записывайте в отдельный файл, а в init.php просто подключайте эти файлы и прописывайте обработчики событий. Мне встречались файлы init.php по 500Kb, где в кашу были смешаны функции, определение констант, классы и инициализация обработчиков. Разумеется, когда приходилось разбираться в этих файлах, я сыпал проклятиями на своих предшественников.

Следующий пункт не касается случая разработки готовых решений для Marketplace, когда целью ставится сделать максимально настраиваемый функционал из публичной части для конечного потребителя. Если вы работаете над конкретным проектом, по конкретному ТЗ –


не стоит пытаться сделать унифицированный шаблон для компонента на все случаи жизни. Лично я придерживаюсь философии – лучше несколько простых шаблонов, использующихся для разных целей, чем один универсальный, но в котором сам черт потом ногу сломит. Разумеется, в каждом конкретном случае нужно отталкиваться от того, что есть – техзадание, варианты реализации и тому подобное, но забывать про «Бритву Оккама» все-таки не стоит. Как пример приведу один проект лизинговой компании, который мне довелось править. Сам проект, конечно, был реализован ужасно, на настоящий ужас был в страницах раздела каталога услуг. У каждого из пяти разделов была собственная верстка, на которых отличалось как положение блоков на странице, так и в принципе наличие некоторых из них. И для всех пяти страниц использовался один шаблон с кучей if-else, дублированием вызовов компонентов, подключением стилей и скриптов, которые, к тому же, периодически конфликтовали друг с другом. Как итог – огромный файл, в котором разобраться «без поллитры» было смерти подобно. Хотя, казалось бы, что мешало сделать 5 разных шаблонов и не создавать трудностей на ровном месте?

Используйте API. Не изобретайте велосипеды там, где это не нужно. Юзайте документацию – весь продукт довольно хорошо описан, а так же каждую функцию можно посмотреть детально на bxapi.ru.

Избегайте прямых запросов к базе. Это частный случай предыдущего пункта – используйте API. Необдуманные, незащищенные запросы могут привести к порче, утере или даже к компрометации данных.

Не используйте компоненты с ЧПУ из корня сайта. Последствия, как правило, довольно печальны, так как ЧПУ использует файл обработчика адресов, попытка использовать его из корня легко ломает вам адресацию других компонентов, а так же 404 страницы. Ничего страшного не будет, если статьи у вас будут адресоваться относительно папки /articles/, а товары относительно /catalog/.

Подключайте css и js с помощью API. До сих пор повсеместно встречаю подключение скриптов и стилей с помощью html-тегов. Используйте объект класса BitrixMainPageAsset и функции addJs() и addCss(). Это позволит объединять файлы и, в последствии, кешировать их одним нажатием чекбокса в настройках главного модуля

Ну и напоследок, ошибка касается не только Битрикса, но уж больно часто я стал встречать проблемы, связанные с ней. Проверяйте на пустоту массив с результатами выборки. Как пример, последний раз встретился с данной проблемой при работе с одним интернет-магазином. Жалоба: страницы иногда грузятся по 16 секунд. С чем связано – не ясно. Методом проб и ошибок выяснил, что страницы грузятся неприлично долго только тогда, когда корзина пустая. Казалось, с чего бы? Как выяснилось, у корзины при наведении появлялось всплывающее окно, в котором отображались изображения товара, положенного в корзину. Ну что сделал предыдущий разработчик? Взял результат работы компонента «маленькая корзина» и в файле result_modifier.php сделал вызов GetList() товаров для выборки изображений с фильтром из массива ID товаров, потом из результатов выборки в массив соответствующего товара добавлял src изображения. В итоге, когда товаров в корзине не было, фильтр уходил пустой, и в выборку попадал ВЕСЬ каталог товаров. Ну а дальше цикл по каждому и… имеем то, что имеем. Ясно, что на этапе разработки при тестовых 15 товарах это было незаметно, и проблемы возникли уже в боевых условиях. Хотя, казалось бы, чего стоило поставить проверку на empty($arResult[‘ITEMS’])…

На этом я заканчиваю свой личный топ «worst practice», касательно разработки на Битрикс. Если хоть кому-то данная информация поможет избежать ошибок в будущем и улучшить свой стиль разработки, значит это было не зря.

habr.com

Научимся создавать новые страницы на комплексном компоненте bitrix:news, как осуществляется настройка ЧПУ Битрикс, настроим автоматические кеширование. Сам комплексный компонент будет вызывать простые компоненты bitrix:news.detail и bitrix:news.list.

Оглавление

  • Создание инфоблока новостей и его настройка
    • Настройка инфоблока
  • Создание страницы новостей
    • Настройки ЧПУ
    • Кеширование
    • Навигация
    • Когда страница отсутствует
  • Если у вас 404 ошибка в комплексном компоненте
    • ЧПУ настроен на работу с символьными кодами, а они не заполнены
    • Разные настройки ЧПУ в параметрах компонента и инфоблока.
    • Не создалась запись в urlrewrite.php
    • Побился .htaccess
    • Не верная передача параметров из комплексного компонента в простой
    • Битрикс не может определить какую страницу открывать

Создание инфоблока новостей и его настройка

Самое первое, что стоит сделать — создать нужный инфоблок. Можно в отдельном типе инфоблоков, можно в уже существиющем.

Но обратите внимание на галочку в типе инфоблока «Использовать древовидный классификатор элементов по разделам«, если её снять, в инфоблоках внутри не будет разделов.

Переходим в панель управления сайтом, открываем Контент Инфоблоки Типы инфоблоков и жмем «Добавить новый тип«.

Создание типа инфоблока в 1С Битрикс

Указываем ID «novosti», название на русском — Новости, на английском — News. Галочку «Использовать древовидный классификатор элементов по разделам» оставляем. Жмем Сохранить.

Создание типа инфоблока новостей в 1C-Bitrix

Далее снова раскрываем Контент Инфоблоки Типы инфоблоков. В списке находим наш новый тип и жмем на него. В нужном нам типе инфоблоков жмем «Добавить инфоблок».

Добавление инфоблока в БУС Битрикс

Настройка инфоблока

Символьный код укажите novosti, выберите нужный сайт, название Новости.

Для работы ЧПУ требуется настроить параметры работы URL.

  • URL страницы информационного блока: «#SITE_DIR#/novosti/» — адрес страницы, где будет располагаться комплексный компонент.
  • URL страницы раздела: «#SITE_DIR#/novosti/#SECTION_CODE#/» — шаблон URL страницы раздела. Если используете #SECTION_CODE#, не забудьте в последующем указать обязательность заполнения символьного кода раздела.
  • URL страницы детального просмотра: «#SITE_DIR#/novosti/detail/#ELEMENT_CODE#/» — шаблон страницы детального просмотра элемента. Так же, если используется #ELEMENT_CODE#, не забудьте указать обязательность символьного кода записей в будущем.

В адресе детального просмотра можно вместо detail использовать макрос адреса раздела, чтобы структура пути была такой «SITE_DIR#/novosti/#SECTION_CODE#/#ELEMENT_CODE#/«, но тогда потребется всем разделам в обязательном порядке указывать раздел, либо для записей без раздела не будет #SECTION_CODE#, а соответственно не будет работать детальная страница.

Доступные макросы для формирования шаблона адреса доступны рядом с полем по кнопке.

Настройка ЧПУ в инфоблоке Битрикс

Важно. Надо чтобы битрикс мог различать пути раздела и детальной страницы. Не получится разделу указать макрос /catalog/#SECTION_CODE#/, а детальной /catalog/#ELEMENT_CODE#/. А если вы так уже сделали, то скажите адрес /catalog/aaa/ — это должна быть детальная страница или раздел? Не понятно, вот и битрикс тоже не поймет и вместо детальной будет пытаться открыть раздел, которого нет. Не спасет даже установка /catalog/#SECTION_CODE#/ и /catalog/#ELEMENT_ID#/. Вам кажется что если передано число — то это детальная, а если код — то раздел. Но код элемента тоже может быть числом. Если детальной установить /catalog/#SECTION_CODE#/#ELEMENT_CODE#/ — то тут уже всё понятно. /catalog/aaa/ — это раздел, а /catalog/aaa/bbb/ — это детальная.

«Индексировать разделы для модуля поиска» и «Индексировать элементы для модуля поиска» — галочки оставим, они нужны для того, чтобы мы могли находить в поиске (например через компонент bitrix:search.page) по сайту разделы и элементы инфоблока.

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

Если не работает ЧПУ в Битрикс, проверить

Переходим к вкладке Поля

Указываем обязательность символьного кода элементов, проверку уникальности кода, автоматическое создание кода из названия элемента.

Если мы не хотим указывать уникальность кода, тогда нам надо уникализировать адреса детальных страниц, например, путем добавления в него ID записи, тогда даже если у некоторых элементов будет одинаковый код, их адреса будут разными.
URL страницы детального просмотра: «#SITE_DIR#/novosti/detail/#ELEMENT_ID#-#ELEMENT_CODE#/«

Аналогично сделаем обязательным символьный код раздела во вкладке «Поля разделов«.

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

Настройка прав доступа к инфоблоку, если не показываются новости на сайте Битрикс не авторизованным пользователям.

Наконец, сохраним инфоблок.

Создание страницы новостей

Вручную копировать откуда-то вызов $APPLICATION->IncludeComponent(…) не будем, потому что вызов компонентов меняется с разными версиями битрикс. Самая актуальная и подходящая версия вызова компонента — в визуальном редакторе на нашем сайте. Этот способ еще и самый удобный.

Не надо помнить для bitrix:news.list свойства, для bitrix:news.detail. Все параметры будем задавать через визуальный редактор.

Перейдем на главную страницу сайта, раскроем панель администратора (эрмитаж), нажмем Создать раздел.

Создание страницы раздела в Битрикс

  • Заголовок раздела: Новости. Этот параметр в будущем будет влиять на формирование хлебных крошек в разделе.
  • Имя папки — novosti. Имя папки в настройках инфоблока должно быть таким же, как тут. Если там мы указали «#SITE_DIR#/novosti/«, то #SITE_DIR# у нас пустой, так как сайт не в отдельной папке, папка раздела novosti.
  • Добавить пункт меню можно снять, либо настройте его нажав Далее.

Жмем готово.

Должна открыться такая страница. «Текст…» сразу удаляем.

Создание страницы в Битрикс

В поиске компонентов ищем news, зеленый компонент перетаскиваем в окно редактирования. Зеленый цвет компонента говорит о том, что он комплексный.

Если списка компонентов у вас нет, нажмите на кнопку справа, он откроется. Если компонент не перетаскивается, проверьте включенный режим правки, должен быть первый «Визуальный режим».

Если не показывается список компонентов в визуальном редакторе битрикс

Перетаскиванием добавьте компонент на страницу.. Так мы добавили на страницу комплексный компонент bitrix:news.

Через несколько секунд, после перетаскивания компонента, у вас появится окно его редактирования.

Выберите тип инфоблока и сам инфоблок — те, которые мы недавно создавали.

Настройки ЧПУ

Далее перейдем к вкладке Управление адресами страниц.

  • Каталог ЧПУ относительно корня сайта: «/novosti/«. Это папка, в которой располагается файл с компонент и текущая соответственно.
  • Страница общего списка — оставляем пустым, так как список у нас на главной странице компонента
  • Страница раздела: «#SECTION_CODE#/«
  • Страница детального просмотра: «detail/#ELEMENT_CODE#/«

Если склеить значения «Каталог ЧПУ» и «Страница раздела» и из параметров компонента, у вас должен получиться «URL страницы раздела» из параметров информационного блока, только без макроса #SITE_DIR#. У нас это и там и тут «/novosti/#SECTION_CODE#/«, всё верно.

Если склеить значения «Каталог ЧПУ» и «Страница детального просмотра» и из параметров компонента, у вас должен получиться «URL страницы детального просмотра» из параметров информационного блока, но без макроса #SITE_DIR#.

Если вкратце, то принцип работы комплексного компонента такой:

  1. Получить адрес, открытый пользователем.
  2. По маскам, которые мы указали на настройках ЧПУ определить, какая страница нужна — список новостей, страница раздела или детальная новость.
  3. В зависимости от этого подключить нужный файл из шаблона комплексного компонента. (news.php, section.php, detail.php)
  4. В подключенном файле уже происходит вызов простого компонента. Для страницы общего списка это news.php, для раздела section.php, для детальной новости — detail.php

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

В каких файлах какой компонент вызывать:

  • news.php — bitrix:news.list, либо bitrix:catalog.section.list, для вывода разделов, вместо элементов.
  • section.php — тот же bitrix:news.list с передачей в параметрах этого:
"PARENT_SECTION" => $arResult["VARIABLES"]["SECTION_ID"],
"PARENT_SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],

Либо можно использовать компонент bitrix:catalog.section.

  • detail.php — bitrix:news.detail с передачей:
"ELEMENT_ID" => $arResult["VARIABLES"]["ELEMENT_ID"],
"ELEMENT_CODE" => $arResult["VARIABLES"]["ELEMENT_CODE"],

Кеширование

В параметрах кеширования проверяем, чтобы было Авто + Управляемое, задано приемлемое время кеширования и снята галочка Учитывать права доступа.

Галочку «Учитывать права доступа» требуется установить только в том случае, если разным группам пользователей будет показываться разный контент. У нас же для всех пользователей новости одни и те же. Лишний кеш на каждую отдельную группу пользователей создавать не будем.

настройки кеширования в комплексном компоненте новостей Битрикс

Навигация

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

Настройки хлебных крошек в компоненте новостей Битрикс

Когда страница отсутствует

Последний пункт в настройках компонента — настройка 404 ошибки. Поставим галочки «Устанавливать статус 404» и «Показ специальной страницы«, чтобы при отсутствии страницы пользователь видел что страница отсутствует при наборе не верного адреса, а не список новостей. Это важно для SEO, чтобы не было дублей страниц.

Настройка 404 страницы в компоненте новостей Битрикс

Всё сохраним и получим раздел с новостями на сайте! При сохранении комплексного компонента, в корне сайта в файле urlrewrite.php создается запись, с помощью которой битрикс определяет обработчик для адресов, которых физически на сайте не существует.
Если компонент сохранять вручную, через FTP, то запись не создастся и ЧПУ работать не будет. Тогда достаточно пересохранить компонент.

Если у вас 404 ошибка в комплексном компоненте

Если в разделе с комплексным компонентом Битрикс говорит вам, что страницы нет, возможно у вас следующая ошибка:

ЧПУ настроен на работу с символьными кодами, а они не заполнены

Если в макросе адресов используется #CODE#, #ELEMENT_CODE#, #SECTION_CODE# — требуется включать обязательность заполнения символьного кода. К сожалению, об этом часто забывают.

Включите обязательность, автогенерацию из названия элемента и заполните для всех записей код.

Разные настройки ЧПУ в параметрах компонента и инфоблока.

Как проверить правильность настройки ЧПУ я описал в статье выше. Перейти

Не создалась запись в urlrewrite.php

В корне сайте откройте файл urlrewrite.php, в нем должны быть строки по типу

array (
    'CONDITION' => '#^/novosti/#',
    'RULE' => '',
    'ID' => 'bitrix:news',
    'PATH' => '/novosti/index.php',
    'SORT' => 100,
  ),

Где /novosti — папка с комплексным компонентом.

Чтобы исправить проблему, пересохраните компонент через визуальный редактор. Если проблема не ушла — требуется разобраться почему не добавляется запись в urlrewrite.php.

Побился .htaccess

В корне сайт откройте файл .htaccess. В нем обязательно должны быть строки:

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
  RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]

Если их нет — добавьте. В случае этой проблемы на сайте не будет работать ни один комплексный компонент.

Так можно исправить проблему в bitrix 404 при включённом чпу в комплексном компоненте.

Проблему сразу можно определить или отсечь посмотрев на ошибку 404. Если загружен шаблон сайта, то 404 из Битрикс, если же вы видите черно белую ошибку от Apache или Nginx, то в битрикс лезть нет смысла. Надо разбираться с .htaccess.

Тут стоит искать проблему в .htacces, Apache, Nginx:

А тут мы видим уже работу Битрикс, значит до него запрос дошел, надо разбираться с ним:

Не верная передача параметров из комплексного компонента в простой

Когда вы на странице добавили комплексный компонент, например bitrix:news, то настраиваете вы его. При том сам он никакую логику не несет, кроме как распределение запросов между простыми компонентами.

И проблема может быть в том, что не все параметры корректно передаются в простой компонент.

Откройте шаблон комплексного компонента и посмотрите как вызываются простые компоненты. Всё должно передаваться из $arParams или $arResult.

Вот я открыл файл шаблона детальной страницы в комплексном шаблоне, тут вызов bitrix:news.detail, у меня путь такой: /bitrix/templates/furniture_pale-blue/components/bitrix/news/.default/detail.php. В файле я вижу что всё хорошо, «захардкоженых» параметров нет.

Битрикс не может определить какую страницу открывать

Не получится разделу указать макрос /catalog/#SECTION_CODE#/, а детальной /catalog/#ELEMENT_CODE#/. А если вы так уже сделали, то скажите адрес /catalog/aaa/ — это должна быть детальная страница или раздел?

Подробнее это разобрано в блоке «Настройка инфоблока», выделил «Важно»

Пожалуйста, оцените на сколько вам понравилась статья!



  • 1С-Битрикс


  • Агентство Romapad


    Агентство Romapad



  • 8 января 2015

404 битрикс - правильная настройка

В битриксе 404 ошибка отрабатывается весьма специфически: неправильный адрес со статических страниц и разделов корректно перебрасывает на страницу 404.php, при этом, сохраняя неправильный URL в адресной строке браузера. То есть, все по SEO.

А вот если неправильный адрес начинается с раздела инфоблока или каталога, то сервер отдаст браузеру 404 статус страницы (и то, при определенных настройках инфоблока, о которых ниже), но 404 страницу не покажет, а покажет корневую страницу инфоблока, причем, иногда совсем другого инфоблока. Но, все-таки, сохранит неправильный URL в адресной строке.

В интернете данный вопрос поднимался не раз. Когда-то популярным решением была настройка в битрикс принудительного редиректа на 404 страницу.))) Перечитав изрядно статей, выполнив несколько найденных инструкций, желаемого результата добиться не удалось(((. Пришлось, вооружившись командой print backtrace, отловить негодяйскую 404 ошибку и заставить ее работать, как положено.

Ставим задачу:

  1. Нужно, чтобы инфоблоки и каталоги в случае неправильной ссылки отдавали 404 статус.
  2. Нужно, чтобы этот статус правильно обрабатывался и приводил к вызову страницы 404.php.

На что стоит обратить внимание?

  1. Файл 404.php лежит в корне сайта. Должен выглядеть вот так (тут все стандартно):
    <? if ($_SERVER['DOCUMENT_URI'] == "/404.php") {
     $_SERVER['REQUEST_URI'] = $_SERVER['DOCUMENT_URI'];
    }
    include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
    CHTTP::SetStatus('404 Not Found');
    @define('ERROR_404', 'Y');
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
    $APPLICATION->SetTitle("Страница не найдена"); ?>  
    ТУТ ТЕКСТ ВСЯКИЙ
    <? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>
  2. В .htaccess должна быть вот такая строчка:
    ErrorDocument 404 /404.php

    Если у вас сервер на nginx, то нужно прописать в конфиге, в секции location, следующее:

    error_page 404 = /404.php;

    Тех. отступление:

    Попробуем симулировать 404 ошибку с какой-нибудь статической страницы и отловить результат через команду debug_print_backtrace();

    Skrinshot-2015-01-01-14.35.46

    Смотрим файл, видим там строку с инклюдом 404 страницы. Она вызывается, очевидно, в том случае, если страница не найдена в структуре файлов и папок, а также в файле urlrewrite.php в корне сайта, где как раз описаны все наши инфоблоки и каталоги (для правильной работы ЧПУ).

    Первая поставленная нами задача выполняется настройкой инфоблоков и компонентов.

  3. Проверим настройки самих каталогов:

    Скриншот 2015-01-01 14.56.00

    URL страницы ИБ — должен указывать на папку, из которой будет осуществляться вызов инфоблока.

    URL страницы раздела — если структура инфоблока будет иметь подразделы, то ссылка должна строиться на основе символьного кода раздела.

    URL страницы детального просмотра — если элемент находится в подразделе, то к ссылке будет прибавляться символьный код раздела перед символьным кодом элемента. Иначе — только символьный код элемента.

  4. И инфоблоков:

    Скриншот 2015-01-01 15.48.25

    То есть, как мы видим, для инфоблоков подразделы можно не описывать.

  5. Проверяем настройки вызова инфоблоков:

    Скриншот 2015-01-01 15.22.18

    Обязательно проверяем, что отмечена галка «Включить поддержку ЧПУ»!

    Каталог ЧПУ — корневая папка инфоблока.

    Раздел — #SECTION_CODE#/ — повторяем из настроек инфоблока, но не ставим слеш в начале, иначе компонент будет работать неверно.

    Детальная информация — #SECTION_CODE#/#ELEMENT_CODE#/ —  ссылка формируется на основе символьного кода раздела (если есть) и кода элемента. Опять же, слеш в начале не ставим!

    Если предполагается, что все элементы будут располагаться в корне инфоблока, без подразделов, то можно использовать следующие настройки:

    Скриншот 2015-01-01 15.49.27

    То есть, поле для страницы раздела вообще можем пропустить, для страницы элемента: #ELEMENT_CODE#/ . Не забываем пропустить слеш в начале!

  6. Отмечаем галочку там же в настройках: «Устанавливать статус 404, если не найдены элемент или раздел:».

    Тех. отступление:

    После сохранения всех настроек, если мы набираем в разделе инфоблока неправильный адрес, то по-прежнему вместо 404 страницы увидим корневую страницу раздела инфоблока, но страница будет иметь в заголовке 404 статус. Посмотреть его можно через браузерную панель разработчика:

    Скриншот 2015-01-01 15.26.32

    Этим мы и воспользуемся, а чтобы данный статус правильно обрабатывался

  7. Добавим следующий код в файл /bitrix/php_interface/init.php:
    <?
    AddEventHandler('main', 'OnEpilog', '_Check404Error', 1);
    function _Check404Error(){
     if (defined('ERROR_404') && ERROR_404 == 'Y') {
     global $APPLICATION;
     $APPLICATION->RestartBuffer();
     include $_SERVER['DOCUMENT_ROOT'] . SITE_TEMPLATE_PATH . '/header.php';
     include $_SERVER['DOCUMENT_ROOT'] . '/404.php';
     include $_SERVER['DOCUMENT_ROOT'] . SITE_TEMPLATE_PATH . '/footer.php';
     }
    }
    ?>

С этого момента страница ошибок будет работать! (наверное))) Если нет, опишите вашу ситуацию в комментариях.

UPD от 29.08.15: чуть обновил код файла 404.php  и сниппет для init.php.

UPD от 15.01.18: настраивал сегодня на одном проекте отладку 404-й ошибки по данной инструкции. Все работает отлично)) Версия битрикса — последняя на указанную дату.





  • 1с битрикс

Агентство Romapad

Работаем с 2009 года. Реализовано более 400 проектов. Слаженная команда профессионалов. Создание и администрирование сайтов. Техническая поддержка. Помощь новичкам.

Подпишитесь на рассылку новостей


21.10.2019


Комментариев нет


13.10.2018


Комментариев нет


12.02.2018


Комментариев нет


21.01.2018


Комментариев нет

Комментарии к публикациям

“Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo”

John DoeAccountant, Colibri

“Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo”

Max PowellCEO, Falcon

“Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo”

Alex PaloOwner, Eagle


04.09.2012


Комментариев нет

Этим постом начинаю цикл, посвященный раскрутке сайтов. И сегодня мы поговорим о том, как

Продолжить чтение


19.09.2012


60 комментариев

Если вы любите Wordpress и вам нужно создать интернет-магазин, то, наверняка, вы в первую очередь

Продолжить чтение


26.09.2012


Комментариев нет

Гаджеты на блоггере — это небольшие готовые модули, которые позволяют быстро подключить к вашему

Продолжить чтение

February 6 2016, 23:33

Category:

  • IT
  • Cancel

Хочу сохранить статью уважаемого Бакирова Марата, который очень помог наладить индексацию сайта!

Bitrix и ошибка 404
Давно бились над проблемой с SEO и применением стандартных комплексных компонентов (bitrix:news, bitrix.catalog) при использовании ЧПУ.

Проблема заключалась вот в чем: при отдаче страницы с отсутствующим элементом или секцией инфоблока выставляется статус «404 Not Found» (в теле компонентов bitrix:news.list, bitrix:news.detail, bitrix:catalog.section, bitrix:catalog.element есть соответствующие строки, но к сожалению не было способа показать тело 404-ой страницы (мы обычно создаем страницу /404.php) с ее оформлением и пр.

Поначалу нас устраивал редирект на эту страницу вида:

LocalRedirect(«/404.php», «404 Not Found»);

но чтобы им воспользоваться приходилось создавать дубликаты компонентов в своем пространстве имен (anima:catalog.section, например).

Потом было найдено более изящное решение, не задевающее компоненты. В стандартных компонентах используется определение константы ERROR_404 в случае проблем с поиском инфоблока, секии, элемента во время выполнения компонента, но по заверениям разработчиков она используется исключительно для статистики. Однако, отображение стрницы – единый runtime и определенные константы можно использовать практически в самом его (runtime-a) конце. Результатом этих роазмышлений стал код в init.php:

/* Неочевидное перенаправление на страницу 404-ой ошибки */
AddEventHandler(«main», «OnEpilog», «Redirect404»);
function Redirect404() {
if(defined(«ERROR_404») ) {
LocalRedirect(«/404.php», «404 Not Found»);
}
}

Довольно легко для понимания и универсально и работает везде, но… У данной конструкции (у редиректа) естьи темные стороны.

Пользователь сайта, случайно вбив ошибочный длинный URL перебрасывался на /404.php без возможности увидеть и исправить ошибку в строке адреса.
Поисковой робот, придя на ошибочную страницу видел странную последовательность: при обращении к несуществующей странице он получал статус 301 Moved Permanently (в редких случаях «404 Not found»;) и переадресацию на страницу /404.php, которая выставляла статус «404 Not found». Немного путано.

Тогда появилась идея: в функции Redirect404() очистить буфер вывода с помощью $APPLICATION->RestartBuffer(); и «заинклюдить» /404.php. Но тут на словах оказалось проще, чем на деле. Беда крылась в том, что пролог и эпилог сайта вызываются через конструкцию require_once и повторно вызвать их (для отображения шапки, футера, стилей на заветной 404-ой странице) оказалось невозможно; другими словами мы теряли, к примеру, меню, вставленное в визуальную часть пролога (header.php шаблона).

Путем экспериментов, проб и ошибок мы пришли к довольно универсальной записи:

AddEventHandler(«main», «OnEpilog», «Redirect404»);
function Redirect404() {
if(
!defined(‘ADMIN_SECTION’) &&
defined(«ERROR_404») &&
defined(«PATH_TO_404») &&
file_exists($_SERVER[«DOCUMENT_ROOT»].PATH_TO_404)
) {
//LocalRedirect(«/404.php», «404 Not Found»);
global $APPLICATION;
$APPLICATION->RestartBuffer();
CHTTP::SetStatus(«404 Not Found»);
include($_SERVER[«DOCUMENT_ROOT»].SITE_TEMPLATE_PATH.»/header.php»);
include($_SERVER[«DOCUMENT_ROOT»].PATH_TO_404);
include($_SERVER[«DOCUMENT_ROOT»].SITE_TEMPLATE_PATH.»/footer.php»);
}
}

Внимательный зритель заметит, что в функции появилась константа PATH_TO_404. Определять данную константу предлагается первой строкой в визуальной части пролога:

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

0 / 0 / 0

Регистрация: 08.12.2013

Сообщений: 2

1

04.06.2015, 21:17. Показов 10225. Ответов 3


Ребят, помогите пожалуйста. Переношу новости с другого сайта, не могу настроить чпу отображения новостей. Показывает код 404
Необходим вывод новостей типа » #SITE_DIR#/news/#SECTION_CODE#/#ELEMENT_CODE#.php «
Создал страницу » #SITE_DIR#/news/newsdetail.php «
Добавил в нее компонент » bitrix:news.detail » и настроил ID новости » ={$_REQUEST[«ELEMENT_ID»]} «
В правилах обработки адресов указал
Условие » #^/news/([a-zA-Z0-9]+$)/([a-zA-Z0-9]+$)/# «
Компонент » bitrix:news.detail «
Файл » /news/newsdetail.php «
Правило » ELEMENT_CODE=$2 «

При переходе по ссылке «новость детально» открывается 404.

Подскажите, пожалуйста, на каком этапе совершил ошибку. Спасибо.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

04.06.2015, 21:17

3

53 / 44 / 10

Регистрация: 10.12.2013

Сообщений: 197

Записей в блоге: 1

05.06.2015, 04:52

2

Обычно в правила обработки адресов даже заглядывать не приходится. Дело видимо в том, что у вас на странице ожидается ELEMENT_CODE, а передается ELEMENT_ID. Согласуйте два параметра. Посмотрите что стоит за знаком в вопрос в ссылке (/news/newsdetail.php?…) и замените либо в ссылке либо в чпу.



0



0 / 0 / 0

Регистрация: 08.12.2013

Сообщений: 2

05.06.2015, 06:32

 [ТС]

3

Цитата
Сообщение от Z_e_e_k_
Посмотреть сообщение

Посмотрите что стоит за знаком в вопрос в ссылке (/news/newsdetail.php?…)

Где это посмотреть?

Добавлено через 8 минут
Пробую изменить условие на » #^/news/([a-zA-Z0-9]+$)/([a-zA-Z0-9]+$).php(\?(.*))?# «, не помогает

Добавлено через 7 минут
Еще подправил

Условие » #^/news/([a-zA-Z0-9]+$)/([a-zA-Z0-9]+$).php# «
ID новости » ={$_REQUEST[«ELEMENT_CODE»]} «

не помогает



0



Оглавление

  • Проверка сайта и настройка 404-й страницы
  • Ошибка элемент/раздел не найден
  • Оформляем 404-ю страницу

Вы наверняка сталкивались с проблемой когда при обращении к несуществующему адресу в каталоге товаров или в разделе новости, вместо 404-й страницы получали ответ «не найден раздел или элемент» при этом серверу в заголовка отдавался статутс 200 ok а не 404 not found. Это не правильно, т.к. поисковик может проиндексировать пустые страницы которые впоследствии повысят количество отказов при заходе реальных посетителей на сайт. И так почему так происходит и как этого избежать.

В первую очередь нам нужно проверить наличие некоторых фалов и настроек на сайте.

Во-первых проверим наличие файла 404.php который должен лежать в корне вашего сайта. Если его нет, можете его создать с таким содержимым:


<?
include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
 
CHTTP::SetStatus("404 Not Found");
@define("ERROR_404","Y");
 
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
 
$APPLICATION->SetTitle("404 Not Found");
 
$APPLICATION->IncludeComponent("bitrix:main.map", ".default", Array(
	"LEVEL"	=>	"3",
	"COL_NUM"	=>	"2",
	"SHOW_DESCRIPTION"	=>	"Y",
	"SET_TITLE"	=>	"Y",
	"CACHE_TIME"	=>	"3600"
	)
);
 
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Ключевыми в этом файле являются строки:


<?
CHTTP::SetStatus("404 Not Found");
@define("ERROR_404", "Y");

Возможно у вас есть сам файл, но отсутствуют эти строки, что и приводит к ошибке в работе 404-й.

Во-вторых, проверьте файл .htaccess (если он поддерживается вашим сервером), в нём должна присутствовать такая директива:


ErrorDocument 404 /404.php

Теперь перейдите к настройкам вашего компонента (обычно это bitrix.catalog или bitrix.news), блоке «настройки 404 ошибки» отметьте галочку «Устанавливать статус 404» (название галочки может отличаться в компонентах, в некоторых она называется «Устанавливать статус 404, если не найдены элемент или раздел:»).
Настройка 404-й страницы
Затем в файл /bitrix/php_interface/init.php (или /local/php_interface/init.php) добавьте следующий код:


<?
AddEventHandler("main", "OnEpilog", "error_page");
function error_page()
{
	$page_404 = "/404.php";
	GLOBAL $APPLICATION;
	if(strpos($APPLICATION->GetCurPage(), $page_404) === false && defined("ERROR_404") && ERROR_404 == "Y")
	{
		$APPLICATION->RestartBuffer();
		CHTTP::SetStatus("404 Not Found");
		include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/header.php");
		include($_SERVER["DOCUMENT_ROOT"].$page_404);
		include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/footer.php");
		die();
	}
}

Этим кодом, мы добавляем в OnEpilog свой обработчик события, который считывает установленный компонентом параметр ERROR_404 и запускает перегрузку буфера подключая файл 404-й страницы. Обычно это 404.php лежащий в корне сайта. Хотя при соответствующем оформлении 404-й страницы, можно (даже будет лучше) не подключать файлы header.php и footer.php.

Если после всех манипуляций 404-я страница не отображается по несуществующему URL, следует проверить файл urlrewrite.php отвечающий за обработку ЧПУ адресов. Иногда, например при размещении компонента умного фильтhа (catalog.smart.filter) на главной странице, в urlrewrite.php прописывается условие, что-то вроде этого:


<?
array(
    "CONDITION" => "#^/([a-zA-Z]+)/([0-9]+)/#",
    "RULE" => "",
    "ID" => "bitrix:catalog.section",
    "PATH" => "/index.php",
),

Обычно в CONDITION — создаётся некорректное регулярное выражение, которое срабатывает на все страницы, в том числе и на не существующие и вместо 404-й страницы, сайт выдаёт что-то ещё, обычно страницу или компонент указанный в PATH этого правила. Если такое правило есть, его необходимо скорректировать или удалить из urlrewrite.php.

Ошибка элемент/раздел не найден

Такая ошибка возникает когда шаблоны ЧПУ в инфоблоке и в настройках компонента не совпадают. Или же пользователь ввёл некорректный URL близкий к шаблону. Проверьте настройки инфоблока:

Настройка ЧПУ в инфоблоке

И настройки ЧПУ в компоненте (обычно комплексном):

Настройка ЧПУ в комплексном компоненте

Так же следует проверить соответствие шаблона и свойств элемента. Например в примере в шаблон URL детальной страницы входит символьный код элемента #ELEMENT_CODE#, если у элемента нет символьного кода, вы получите ошибку. Но правильнее конечно, не показывать такие сообщения (элемент не найден, раздел не найден), компонент должен установить статус 404 и должен сработать скрипт показывающий пользователю /404.php с соответствующим ответом в заголовке. В противном случае, могут быть проблемы с SEO сайта.

Оформляем 404-ю страницу

По умолчанию 404.php в 1С Битрикс содержит компонент карты сайта и выводит список ссылок взятый из файлов формирования меню. При этом на странице так же остаётся полноценная шапка и подвал сайта (отрабатывают header.php и footer.php шаблона), что на мой взгляд не правильно. Кстати сеошники из компании Кокос, с которыми мне приходилось сталкиваться, так же не рекомендовали выводить шапку и подвал с полноценной навигацией по сайту на 404-й странице.

На мой взгляд 404-я должна говорить пользователю что он всё ещё на том же сайте где и был секунду назад,  отвечать на вопрос почему он здесь и что делать дальше и отдавать соответствующие заголовки поисковому роботу.

И так давайте выведем 404-ю страницу битрикс без шапки и подвала, но при этом подтянем ядро системы, чтобы мы могли подключить стили шаблона по средствам константы SITE_TEMPLATE_PATH. Убираем всё лишнее, подключаем ядро, получаем такой файл:


<?
//Подключаем ядро битрикса без шапки
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
//Устанавливаем необходимые заголовки
CHTTP::SetStatus("404 Not Found"); @define("ERROR_404","Y");


Чтобы посетитель не подумал что он покинул ваш сайт, стили оформления 404-й страницы должны быть такими же как и на всём сайте (заголовки, шрифты, цвета, иконки, картинки). Обязательно (минимально) на этой странице должен быть логотип.

Я люблю когда сообщения об ошибках читаются сразу, поэтому пишу их большими шрифтами, например Open Sans Condensed, не мельчите и объясняйте пользователю куда он попал и что ему дальше делать (вернуться на главную страницу, сделать запрос в форме поиска, в конце концов позвонить или написать вам). У меня получилась такая страничка:


<? require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); //Подключаем ядро битрикса без шапки CHTTP::SetStatus("404 Not Found"); //Устанавливаем необходимые заголовки @define("ERROR_404","Y");  ?>
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,300italic,700|Arimo:400,400italic,700,700italic|Noto+Sans:400,400italic,700,700italic&subset=latin,cyrillic-ext' rel='stylesheet' type='text/css'>

<div class="container404">
	<img src="<?=SITE_TEMPLATE_PATH;?>/images/logo.jpg" alt="Название сайта">
	<span class="title404">404</span>
	<span class="subtitle404">Страница не найдена</span>
	<span class="description404">Возможно запрашиваемая вами страница была удалена или перемещена. Вернуться <a rel="nofollow" href="/">на главную</a>?</span>
	<span class="contacts404">позвоните нам: <span class="phone404"> +7 (999) 000 - 00 - 00</span> или напишите на e-mail: <a target="_blank" href="mailto:example@mail.ru">example@mail.ru</a></span>
</div>

Добавим немного CSS стилей для полноты картины:


.container404 { text-align: center; width: 1200px; margin: 0 auto; margin-top: 100px;}
.container404 img { display: block; margin: 0 auto; margin-bottom: 50px; }
.container404 a { color: #F0A229; }
.container404 a:hover { text-decoration: none; }
.title404 { font-family: 'Open Sans Condensed', sans-serif; font-size: 60px; line-height: 80px; display: block; }
.subtitle404 { font-family: 'Open Sans Condensed', sans-serif; font-size: 40px; line-height: 60px; display: block; }
.description404 { font-family: 'Open Sans Condensed', sans-serif; font-size: 30px; line-height: 40px; display: block;}
.contacts404 { margin:0 auto; width: 800px; padding: 10px 0px 100px 0px; font-family: 'Open Sans Condensed', sans-serif; font-size: 30px; line-height: 40px; }
.phone404 { font-weight: bold; }

Вроде бы всё. Ах да чуть не забыл! Нужно проверить всё ли правильно отдаётся поисковому роботу. Для этого перейдите на сайт, вызовете консоль разработчика (обычно клавиша F12 или пункт в меню инструментов браузера «инструменты разработчика» или что-то подобное), перейдите на вкладку Сеть/Network введите адрес несуществующей страницы и посмотрите какой ответ вернёт сервер (вкладка Status):

Работа 404-й страницы

Как видите всё в порядке, сервер вернул 404-й заголовок, что означает — страница не существует, а следовательно поисковик не проиндексирует ненужные адреса и в поиск попадут только реально существующие документы вашего сайта. Теперь точно всё. Желаю удачи!

Доброго времени суток!

На одном проекте встала задача для комплексного компонента каталога, а в частности при выбранном фильтре проверять параметры которые передаются в URL-е и если в нем находятся несуществующие параметры выводить 404 страницу (при ЧПУ для catalog.smart.filter).

Для примера, есть действующая рабочая страница с адресом/catalog/dveri/filter/tolshina_polotna-is-35/apply/ и есть старый адрес (или просто любой спамный адрес) /catalog/dveri/filter/tolshina_polotna-is-999999999/apply/. Т.е. такого параметра в фильтре нет, но страница все равно отдает 200 код и выводит данные по странице без фильтра. Вот её то нам и нужно убрать, т.е. выводить 404 код и страницу.

Сразу хочу сказать, что показанная реализация далеко не идеальная и подходит на минимальных изменениях комплексного шаблона компонента, но каждый может её донастроить «под себя». Мне для выполнения задачи хватило минимальных дополнений.

Что делаем:

1) убеждаемся, что у нас добавлен обработчик события на эпилоге, проверяющий константу ERROR_404 и при её наличии выводящий 404 страницу с нужным кодом. Примерно такого содержания:

AddEventHandler("main", "OnEpilog", "error_page");
function error_page()
{
    $page_404 = "/404.php";
    GLOBAL $APPLICATION;
    if(strpos($APPLICATION->GetCurPage(), $page_404) === false && defined("ERROR_404") && ERROR_404 == "Y")
    {
        $APPLICATION->RestartBuffer();
        CHTTP::SetStatus("404 Not Found");
        include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/header.php");
        include($_SERVER["DOCUMENT_ROOT"].$page_404);
        include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/footer.php");
        die();
    }
}

Добавить его можно в init.php например.

2) Мы будем проверять, что выбран адрес с установленными значениями фильтра (в моём случае это наличие /filter/), а также есть параметры фильтрации для catalog.section (по умолчанию глобальная переменная $arrFilter, у вас может быть другая).

Для этого идем в шаблон нашего catalog.section в файл result_modifier.php и там ставим проверку (можно её поставить перед вызовом catalog.section, как вам угодно)

global $arrFilter;
$curPage = $APPLICATION->GetCurPage(false);

if(strpos($curPage, "/filter/") !== false && empty($arrFilter))
{
	define("ERROR_404","Y");
}

Как вы можете видеть я проверяю вообще на пустоту массива фильтра $arrFilter, если он у вас где-то еще переопределяется и там присутствуют другие значения (кроме тех, что устанавливает catalog.smart.filter) — вам нужна более сложная логика для проверки. Но для общего примера и понимания мне кажется этого достаточно.

Все, после этого если адрес страницы содержит /filter/, а параметров фильтрации нет никаких, будет отдаваться 404 страница.

Проблема — компоненты при возникновении 404й ошибки не отдают 404.php.

Проблема 404-ой страницы на сайтах под управлением 1С-БУС известна давно, и до недавнего времени не имела валидного решения. Сегодня я расскажу о текущем способе перехвата 404-ой ошибки и вывода пользователю нужной страницы.

Начнем по порядку.

404 & Bitrix:catalog.

Первичная настройка.

Для начала пройдемся по настройкам ИБ и компонента.

Настройки инфоблока

Настройки инфоблока

  • «URL страницы информационного блока» — тут вроде все понятно, просто указываем каталог из которого происходит вызов компонента для этого ИБ.
  • «URL страницы раздела» — тут нужно быть аккуратным, если все элементы ИБ лежат в корне раздела, то мы не можем использовать.
  • «#SECTION_CODE#» — при такой настройке роутер компонента будет путать разделы и элементы ИБ. Чтобы этого не происходило мы используем «#SECTION_CODE_PATH#».
  • «URL страницы детального просмотра» — т.к. мы кладем все элементы в корень, то здесь используется только «#ELEMENT_CODE#».

На этом с настройками ИБ закончили.

Настройки компонента

Настройки компонента

  • «Каталог ЧПУ» — соответственно раздел в котором происходит вызов компонента
  • «Раздел» — повторяем настройку из ИБ, но перед «#» не ставим слеш «/», в противном случаи компонент будет работать не верно!
  • «Детальная информация» — повторяем настройку из ИБ, но перед «#» не ставим слеш «/», в противном случаи компонент будет работать не верно!
  • И не забудем про «волшебную галочку».
  • Настройки компонента

С настройками компонента закончили.

Элемент не найден

Теперь о грустном — 404й статус мы вроде как получаем, но компонент не спешит перебрасывать нас на 404.php, а просто пишет что раздел или элемент не найден.

А нам то нужно отобразить 404ю, чтобы юзер понял что что-то пошло не так, показать ему доп менюшку и т.д.

Решение проблемы.

Для решения этой проблемы мы воспользуемся механизмом событий 1С-БУС.

//событие "ловушка" для 404й
AddEventHandler('main', 'OnEpilog', '_Check404Error', 1);
function _Check404Error(){
   if(defined('ERROR_404') && ERROR_404=='Y' || CHTTP::GetLastStatus() == "404 Not Found"){
      GLOBAL $APPLICATION;
      $APPLICATION->RestartBuffer();
      require $_SERVER['DOCUMENT_ROOT'].SITE_TEMPLATE_PATH.'/header.php';
      require $_SERVER['DOCUMENT_ROOT'].'/404.php';
      require $_SERVER['DOCUMENT_ROOT'].SITE_TEMPLATE_PATH.'/footer.php';
   }
}

В эпилоге мы запускаем проверку на установку константы «ERROR_404» и ее текущее значение, а также проверяем последний выставленный статус, это позволяет выловить всевозможные проявления 404й ошибки у 1С-БУС. Далее мы рестартуем HTML буфер подготовленный системой для вывода. Подключаем хедер текущего шаблона, подгружаем тело 404й страницы, а затем подключаем футер текущего шаблона.
Данный подход позволяет сохранить текущий URL, шаблон и навигацию, поэтому пользователь легко сможет перейти обратно в рабочий раздел, а также в контентной области отображаем тело 404й страницы, это дает понять что запрошенной страницы действительно нет.

Ошибка 404

404 & Bitrix:news.

К сожалению компонент Bitrix:news пока не умеет адекватно отдавать хотя бы голый 404й статус, мы в поиске решения.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Чпу doosan dnm 400 1012год не работает 4 ось выскакивает ошибка 2323
  • Чпр 315 урал ошибка 3