Network error при загрузке изображений в 1С-Битрикс: нашли две причины одной ошибки
Заказчик: Центр эстетической медицины AMADEO 9 лет вместе
Сайт:
Проблема
При загрузке изображения в элемент инфоблока на сайте, работающем на 1С-Битрикс, возникала ошибка:
Network error
В консоли браузера фиксировался HTTP-статус:
POST /bitrix/tools/upload.php?lang=ru 400
Из-за отсутствия текста в ответе определить причину непосредственно через браузер было невозможно. При этом:
права на файлы и каталоги были корректными;
свободное место на хостинге было;
загрузка происходила на виртуальном хостинге без доступа к SSH.
Диагностика
Проверка access log показала:
POST /bitrix/tools/upload.php?lang=ru HTTP/2.0 400 0
Статус 400 и нулевой размер ответа указывали на принудительное завершение запроса без формирования ответа.
При анализе доработок сайта был обнаружен пользовательский класс защиты CProtect. Он контролировал POST-запросы к ряду системных файлов Битрикс, включая:
/bitrix/tools/upload.php
При обнаружении подозрительного запроса обработчик принудительно возвращал:
http_response_code(400); die();
Именно эта дополнительная защита блокировала штатную загрузку файлов в административной части сайта.
Первое исправление: пользовательская защита
Из списка файлов, которые обрабатывались дополнительной защитой, был исключён штатный обработчик загрузки Битрикс:
/bitrix/tools/upload.php
После этого изображения стали успешно загружаться.
Однако возникла вторая проблема: после нажатия кнопки сохранения элемента инфоблока операция завершалась ошибкой.
Вторая причина
В журнале ошибок Битрикс была обнаружена запись:
Call to undefined function Dev2fun\ImageCompress\exec()
Модуль использовал внешнюю утилиту jpegoptim для оптимизации изображений и пытался запускать её через PHP-функцию exec(), которая была отключена на виртуальном хостинге:
В результате изображение загружалось, но при сохранении элемента инфоблока модуль обработки изображений вызывал отключённую функцию PHP, что приводило к фатальной ошибке.
Второе исправление: безопасная обработка отсутствия exec()
В код модуля была добавлена проверка доступности системной функции:
if(!function_exists(’exec’)){
return false;
}
Это позволило модулю корректно определить, что внешняя утилита jpegoptim недоступна.
Вместо фатального завершения работы:
изображение сохраняется;
элемент инфоблока успешно добавляется или редактируется;
jpegoptim просто не используется;
запрещённая на хостинге функция exec() остаётся отключённой.
Результат
Проблема оказалась не в одной, а сразу в двух независимых причинах:
Дополнительная защита сайта блокировала штатный запрос загрузки файлов Битрикс;
Модуль оптимизации изображений пытался использовать отключённую на виртуальном хостинге функцию PHP.
После корректировки двух файлов:
изображения успешно загружаются;
элементы инфоблока сохраняются без ошибок;
системная функция exec() не включалась;
остальные механизмы дополнительной защиты сайта сохранены.
Вывод
Ошибка Network error в административной части Битрикс не всегда означает проблему с сетью, правами на файлы или ограничениями PHP.
В данном случае одна видимая ошибка скрывала две последовательные проблемы. Сначала собственный защитный механизм сайта блокировал загрузку изображения, а после устранения этой причины проявилась вторая ошибка — несовместимость модуля оптимизации изображений с ограничениями виртуального хостинга.
Последовательная диагностика позволила устранить обе причины без ослабления серверной безопасности и без включения потенциально опасных системных функций PHP.
Столкнулись с похожей проблемой?
Ошибки на сайте не всегда имеют очевидную причину. Мы разбираемся в работе 1С-Битрикс, анализируем логи, находим конфликты доработок и модулей и устраняем проблемы без лишнего вмешательства в работу сайта.
Расскажите, что происходит — разберёмся в проблеме и предложим решение!