Заметки на манжетах
4 декабря 2009 г.
Еще раз о надоевшем. То есть, о коде статуса несуществующей страницы.
Зануда я или нет? :-) Чтобы у читателей не было сомнений, повторю еще раз: ройтесь в логах почаще! Это дает внимательным людям информацию и будит мысли. А невнимательным нечего делать ни в веб-разработке, ни в SEO.
Меня, например, давно занимал вопрос: что делать с назойливым интересом поисковых ботов к несуществующим страницам? У них долгая память – мне достаточно было один раз ошибиться в логике движка, чтобы потом боты полгода регулярно запрашивали неверные ссылки, получали в ответ статус 404 и снова возвращались посмотреть, не появилось ли чего по этому же адресу. Интерес к битым ссылкам был устранен только запретом в robots.txt, но стоило мне этот запрет снять, как боты немедленно пошли той же дорогой. Оказывается, рано снял. Боты забыть дорогу еще не успели.
Вообще-то в протоколе HTTP/1.1 для такого случая есть код статуса «410 Gone» – он означает, что страница удалена навсегда. Но раньше нигде не встречалась информация, как боты понимают этот статус. Не так давно информация была наконец-то получена. На справочном форуме вебмастеров Google. Спасибо, Оксана, строители самодельных движков ценят информацию и помнят добрые дела.
Остался открытым только один вопрос. А как различать визит бота за страницей, которая была, но удалена, и запрос страницы, которая никогда не существовала (например, по вражьей битой ссылке)? Хранить информацию об адресах всех страниц, которые были удалены? CMS и так усложняются с каждым днем, нагружая множество серверов лишней работой и лишними данными. И переделка структуры данных даже в несложном движке – работа немаленькая...
Решение пришло неожиданно. Оно опиралось только на знание повадок поисковых ботов. Если бот уже хоть раз считывал страницу, он в повторном запросе поставит If-Modified-Since с датой предыдущего запроса к странице. Если приходит по этому адресу впервые, If-Modified-Since в его запросе не будет. Вот и весь признак. Если спрашивает изменения, то эту страницу он уже считывал, а значит, она была. Нужно отдать 410. Если он впервые пришел и об изменениях не спрашивает, отдадим ему 404.
Вот и вся хитрая логика. Подробнее с образцом кода на php напишу статейку немного позже. Заодно и о статусах перенаправления кое-что расскажу.