Столкнулся с интересной ошибкой, страница панели управления сайта на CMS MODX стала время от времени отображаться некорректно, вместо страницы на все окно браузера растягивалось меню панели управления MODX.
Долго не мог найти причину ошибки, в консоли браузера не показывалось никаких ошибок, а верстка рушилась, после обновления страница могла корректно отобразиться, то есть ошибка повторялась не постоянно.
Потратив несколько часов на проверку и случайно заметил, что в панели разработчика (f12) в коде страницы в самом её начале выделяется пустой символ, при выборе «Edit as HTML» пустой символ превращался в
Оказалось, причина в кодировке файлов, часть файлов по какой-то причине были в UTF8 c BOM, в основном это были файлы дополнения poll, оно реализует функции голосования для MODX.
Для массовой чистки от BOM воспользовался php скриптом:
$HOME = dirname(__FILE__); // Указываем папку с которой начать рекурсивный поиск $WIN = 0; //Если север на windows, то указать 1 // Рекурсивный поиск function RecursiveFolder($sHOME) { global $BOMBED, $WIN; $win32 = ($WIN == 1) ? "\\" : "/"; $folder = dir($sHOME); $foundfolders = array(); while ($file = $folder->read()) { if ($file != "." and $file != "..") { if (filetype($sHOME . $win32 . $file) == "dir") { $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file; } else { $content = file_get_contents($sHOME . $win32 . $file); $BOM = SearchBOM($content); if ($BOM) { $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file; // Удаляет 3 символа из начала файла $content = substr($content, 3); // Результат записывает в исходный файл file_put_contents($sHOME . $win32 . $file, $content); } } } } $folder->close(); if (count($foundfolders) > 0) { foreach ($foundfolders as $folder) { RecursiveFolder($folder, $win32); } } } // Поиск BOM в файле function SearchBOM($string) { if (substr($string, 0, 3) == pack("CCC", 0xef, 0xbb, 0xbf)) return true; return false; } ?>Поиск и удаление UTF8 BOM $BOMBED = array(); RecursiveFolder($HOME); $list = ''; foreach ($BOMBED as $utf) { $list .= $utf . "
\n"; } if (!empty($list)) { ?>BOM был найден в:
= $list; ?> } else { ?>BOM не найден
} ?>
Достаточно загрузить файл с эти скриптом в корневую директорию и запустить его.
Комментарии ()