Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

ERROR_404

00 голосов
9
Здравствуйте!

Подскажите, пожалуйста - как в Битриксе (в PHP файле) обязать файл выдать серверное сообщение 404 (страница не найдена)?

Конструкция:

@define("ERROR_404", "Y");

Почему-то не срабатывает :(
спросил 05 Июнь, 13 от Redmond (120 баллов)

9 Ответы

00 голосов
А в настройках главного модуля у вас, случаем, не стоит крыжик "Посылать в заголовке статус 200 на 404 ошибку"?
ответил 05 Июнь, 13 от Ly (4,580 баллов)
00 голосов
Ой, какая прелесть. Битрикс в любом случае возвращает 200 Ok.

Workaround: вместо @define("ERROR_404", "Y"); используйте такую конструкцию:
Код
if (strpos(php_sapi_name(),'cgi') !== false) 
    header('Status: 404 Not Found'); 
else 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
ответил 13 Июнь, 13 от Ly (4,580 баллов)
00 голосов
Цитата
Dmitry Ban пишет:
Ой, какая прелесть. Битрикс в любом случае возвращает 200 Ok.

Да, @define("ERROR_404", "Y"); нужен лишь для статистики, не более, хотя почему не включена отправка хидеров при такой константе самим ядром по умолчанию? /вопрос уже к разработчикам/
ответил 16 Сен, 13 от Arn4 (2,140 баллов)
00 голосов
Цитата
Dmitry Ban пишет:
Ой, какая прелесть. Битрикс в любом случае возвращает 200 Ok.


Да. Даже при выключенной галке...
Огромное спасибо за код. Теперь всё работает как надо! :)
ответил 14 Дек, 13 от Redmond (120 баллов)
00 голосов
А можно еще редирект на 404.php сделать?
ответил 29 Март, 14 от Manakus (160 баллов)
00 голосов

Еще можно вот так:

@define("ERROR_404", "Y"); 

А в init.php :
<code>

AddEventHandler('main', 'OnEpilog', '_Check404Error', 1);

 
function _Check404Error()
{
if (defined('ERROR_404') && ERROR_404=='Y')
{
GLOBAL $APPLICATION;
$APPLICATION->RestartBuffer();
include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.SITE_TEMPLATE_ID.'/header.php';
require ($_SERVER['DOCUMENT_ROOT'].'/404.php');
include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.SITE_TEMPLATE_ID.'/footer.php';
}
}

</code>

ответил 11 Июль, 14 от Gendos (670 баллов)
00 голосов
Цитата
Беляев Александр Петрович пишет:
А можно еще редирект на 404.php сделать?

А, увидел что стандартная /404.php тоже неустанавливает header 404 ! Это может быть рассмотрено некоторыми поисковиками как спам?
ответил 22 Июль, 14 от Manakus (160 баллов)
00 голосов
Всех приветствую!
Подскажите пожалуйста по следующему моменту:
404.php нормально отрабатывает, но вот не всегда....
Использую ЧПУ через urlrewrite.php
Вот такое правило:
Код
   array(
      "CONDITION"   =>   "#^/about/news/([0-9]+)/#",
      "RULE"   =>   "ID=$1",
      "PATH"   =>   "/about/news/detail.php",
   ),

и что получается:
по адресу : http://mydomen.ru/about/news/3/ - новость есть - выводится
по адресу : http://mydomen.ru/about/news/31/ - новости нет - редирект на 404.php
по адресу : http://mydomen.ru/about/news1/3/ - такой папки даже нет, выводится текст 404.php, но самого редиректа на нее нет - собственно вопрос - можно ли это как-то решить?

Заранее спасибо =)
ответил 23 Ноя, 14 от Aythis (740 баллов)
00 голосов
Цитата
Антон Долганин пишет:
Да, @define("ERROR_404", "Y"); нужен лишь для статистики, не более, хотя почему не включена отправка хидеров при такой константе самим ядром по умолчанию? /вопрос уже к разработчикам/


У меня другой вопрос к разработчикам.
Если @define("ERROR_404", "Y"); не устанавливает статус 404, зачем нужен чекбокс "Посылать в заголовке статус 200 на 404 ошибку"?
ответил 19 Март, 15 от LaX (100 баллов)

Связанных вопросов не найдено