Joomla, Yandex и 403 Forbidden
Очередной пост из серии хозяйке на заметку. История уже не свежая — октябрь-ноябрьская, пишу, чтобы не забыть, да и не я один наступил на подобные грабли — авось кому и сгодится.
На одном из проектов, живущем без CMS, пришлось установить Joomla — не неё пал выбор владельца. Через некоторое время после установки самой последней версии Джумла сайт стал выпадать из индекса Яндекса.
В панели вебмастера был обнаружен рост числа исключенных документов по следующей причине:
Исключённые страницы — Ошибки на стороне сервера или сайта
HTTP-статус: Доступ к ресурсу запрещён (403)
При этом при проверке через http://webmaster.yandex.ru/server-response.xml я получал сообщение, что у меня на сервере всё хорошо.
На всякий случай отписал Платону такой вопрос:
Здравствуйте.
После перевода статичного сайта на движок Joomla возникла проблема с индексацией в Яндексе.
В логах сервера видно, что яндекс получает 403 сообщение об ошибке при обращении к любому документу сайта, включая robots.txtНо, при этом при проверке доступности страниц при помощи http://webmaster.yandex.ru/server-response.xml я вижу что проблем нет — страница загружается и код ответа 200 ОК.
Не подскажете, в чём может быть проблема?
У меня самого были мысли о каком-нибудь злобном взломе через достаточно уязвимый движок Joomla, и соответственно я ожидал наличия в php документах несанкционированных вставок, или говоря по-иноземному injection. Но очень быстро в логах были обнаружены следующие следы:
178.154.206.251 — — [18/Jun/2013:06:58:30 +0400] «GET /robots.txt HTTP/1.1» 403 280 «-» «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
В общем сразу стало очевидно, что следы взлома следует искать в .htaccess, так как текстовый robots.txt не может сам себя запретить.
Но .htaccess оказался штатным джумловским. И единственное подозрительное место в нём было таким:
## Begin — Rewrite rules to block out some common exploits.
# If you experience problems on your site block out the operations listed below
# This attempts to block the most common type of exploit `attempts` to Joomla!
#
# Block out any script trying to base64_encode data within the URL.
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
# Block out any script that includes a <script> tag in URL.
RewriteCond %{QUERY_STRING} (< |%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL.
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL.
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Return 403 Forbidden header and show the content of the root homepage
RewriteRule .* index.php [F]
#
## End — Rewrite rules to block out some common exploits.
По всему выходит, что робот Яндекса каким-то непостижимым образом трактовался как эксплоит. Тем временем от Платона подоспел такой вот ответ:
Здравствуйте, Артем!
На запрос страниц сайта Ваш сервер возвращает роботу HTTP код 403, в связи с этим они не могут быть проиндексированы и временно не участвуют в поиске.
По вопросу возникновения и устранения этой проблемы, пожалуйста, обратитесь к администратору Вашего сайта или сервера.
Если ошибка больше возникать не будет, то страницы по мере обхода сайта роботом будут проиндексированы и с последующими обновлениями поисковых баз смогут появиться в поиске.Форма проверки ответа в панели Яндекс.Вебмастер может не выявить проблему, так как лишь имитирует работу индексирующего робота и имеет IP-адрес, отличающийся от IP-адреса робота.
—
С уважением, Платон Щукин
Служба поддержки Яндекса
http://help.yandex.ru/
В переводе на русский ответ означает: сервис в панели Яндекс.Вебмастер у нас есть, но он нерабочий. И коль назвался администратором веб-сервера, то сам и выкручивайся. Что хоть и обидно, но справедливо 🙂
А выкрутился я так. Для начала закомментировал в .htaccess весь блок борьбы с эксплоитами. Для тех кто не знаком с синтаксисом .htaccess — строка комментируется при помощи знака # в начале строки. Что в общем-то помогло — документы стали возвращаться в индекс.
Но после я и вовсе вместо Джумлы поставил Вордпресс. Так, на всякий случай 🙂
Аминь.