Быстрая CMS
Обратная связь Карта сайта
Главная Создание сайтов Практика Строим CMS Наивное О проекте Блог

Лишние страницы в статике

Как только был обнаружен вред «дубликатов страниц», нашлись и вредители. Не думайте, что статические сайты защищены от ложных ссылок. Наоборот, они совершенно беззащитны. Конечно, на запрос несуществующего HTML-файла сервер ответит «404 Not Found» и без нашего вмешательства. Но распространение псевдостатики сделало привычными и статические URL с параметрами.
Наподобие /index.html?x=2&y=15. Поисковик «не знает», что сайт статический и параметров быть не должно.

Такая ссылка на статику даст поисковику повод запросить страницу по этому адресу и поисковик ее получит. Сервер находит файл index.html, значит не нужно посылать сообщение об ошибке. А параметры? Обработка параметров – уже дело скрипта.

Но на самом-то деле это статическая страница, а не скрипт, обрабатывать параметры нечему. Вот и осядет в индексах поисковых систем ненужный дубликат главной страницы. Мне пришлось столкнуться с этим задолго до того, как о проблеме широко заговорили. Из-за такого дубликата главная страница статического сайта «вылетела» из индекса Рамблера, а вместо нее там появился дубль с параметром. Вероятно, потому, что он был точной копией главной страницы, но с самой свежей датой индексирования. Тогда я просто сделал в начале индексного файла вставку php-кода, который отсылал статус 404 при обнаружении любых GET-параметров.

Но позднее, когда вопросы защиты обсуждались на форуме, нашелся лучший способ. Главное достоинство – не нужно передавать HTML-файлы обработчику php. И вставки php-кода во все файлы подряд делать не нужно. Используем всемогущий модуль mod_rewrite.
Запишем в файл .htaccess такие директивы:


RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} ^.+$
RewriteRule (.*) ----.html [L]

При этом файл ----.html должен отсутствовать на сайте (имя файла может быть любым, главное, чтобы такого файла не было). Что же делает этот набор директив? Первые две строки – запуск механизма преобразований и установка в качестве базы корня сайта.

Если в запрошенном URL встретится вопросительный знак, все символы строчки URL, стоящие после него, попадают в переменную окружения QUERY_STRING. Все, что нам нужно – проверить, пуста ли эта строка. Что и делает условие RewriteCond. Условие гласит «если между началом и концом строки QUERY_STRING находится хоть один символ, выполнить преобразование». А следующей строкой стоит правило преобразования – «вместо URL, состоящего из любого количества любых символов, передать файл ----.html». Такого файла нет и сервер, получив этот запрос, выдаст статус ошибки «404 Not Found».

Это самый простой способ решения проблемы, можно использовать и более изящные варианты. Например, вместо несуществующего файла подставить имя php-скрипта, который сначала выдаст заголовок с кодом статуса 404, а вслед за ним считает и передаст запрошенный HTML-файл. В этом случае пришедший по ссылке робот получит отклик «нет такой страницы», а в браузер посетителя-человека попадет нужная страница, несмотря на статус 404.


На заметку вебмастеру: часто хостинг предоставляет возможность назначить свои собственные страницы сообщения об ошибке взамен сообщений сервера. Нужно помнить, что такой страницей для ошибки 404 всегда должен быть скрипт, посылающий заголовок с кодом статуса. Если вы назначите статическую HTML-страницу, посетитель ее получит, робот тоже, а в заголовке, посланном сервером вместе с ней, может уже не быть статуса 404. При подмене страницы сообщения иногда подменяется и статус. Этим грешит, например, хостинг РБК, перенаправляя посетителя с несуществующей страницы сайта на свою главную.