четверг, 18 июня 2015 г.

Исправляем ошибку в компоненте Xmap

  На днях, когда я случайно заглянул на страницу «Файлы Sitemap» в сервисе «Яндекс-Вебмастер», моё внимание привлекло сообщение об ошибке в файле карты сайта. Удивлён я был не столько самой ошибке, сколько тому, что последняя загрузка этого файла Sitemap была больше месяца назад, а при обходе роботом использовалась предыдущая успешно загруженная, но уже успевшая изрядно устареть версия файла.

  По клику на ссылку «1 ошибка» можно узнать её тип. В моём случае данные подробности ограничились строчкой «Не удалось загрузить файл».

  «Странно» — подумал я, копируя ссылку на карту сайта и собаясь проверить файл «методом тыка». К ещё большему удивлению, файл Sitemap был успешно сгенерирован сервером и загружен в мой браузер. Предположив, что робот Яндекса не смог загрузить файл Sitemap из-за кратковременных проблем на хостинге, и недоумевая, почему за столь продолжительный срок не была сделана повторная попытка его загрузить, я решил написать сообщение в службу поддержки и на удивление быстро получил ответ.

  Оказалось, что сервер, отдавая файл Sitemap, указывал в HTTP-заголовках директиву «Content-encoding», а робот Яндекса, видя наряду с ней несжатый контент, отказывался даже пытаться его обрабатывать. Как сообщил сотрудник службы поддержки поисковой системы, «Согласно стандартам, заголовок Content-encoding не нужен, если контент не сжат». И всего-то.

  Решение долго ждать себя не заставило. Идём в папку с компонентом, который генерирует карту сайта, и проверяем PHP-скрипты один за другим. На своём сайте для генерации файлов Sitemap я использую компонент Xmap (CMS Joomla!), решение проблемы в котором кроется в файле /components/com_xmap/xmap.php.

if ($view=='xml') {
    Header("Content-type: text/xml; charset=UTF-8");
    Header("Content-encoding: UTF-8");
}

  Удаляем либо комментируем ненужный нам заголовок, сохраняем и обновляем файл на сервере. Всё. Через некоторое время робот поисковой системы сделает повторную попытку загрузить файл Sitemap и, увидев, что ошибки более нет, обработает данные и начнёт использовать его при обходе.