Чаще всего сообщение об ошибке является стандартным — мол, документ не найден, так что пишите администратору. И в большинстве случаев посетитель, увидев подобное сообщение, просто закрывает окно браузера и уходит куда-то еще... Поэтому сегодня мы поговорим о том, как удержать посетителя, пришедшего на ваш сайт по устаревшей и давно «сдохшей» ссылке...
А заодно и о том, как сделать так, чтобы ссылки «дохли» не очень активно.
404-я ошибка появляется из-за опечаток, переезда или удаления документовДля начала давайте разберем причины появления «битых» внутренних ссылок. Это могут быть опечатки, изменение навигации или устаревание (удаление) страниц. Будем разбираться по порядку.
Опечатки
Увы, от них никуда не деться. Люди любят ошибаться, клавиатуры — залипать, CapsLock — нажиматься вместо Shift и так далее, и так далее... Именно для того чтобы вылавливать подобные ошибки, существует класс программ, называемых «линк-валидаторами», которыми рекомендуется эпизодически проверять ваш сайт — особенно после каких-то обновлений. Это, разумеется, не панацея, особенно если сайт очень большой и динамический, но все же использование линк-валидаторов позволяет выловить наиболее явные ошибки. Одной из очень удобных программ этого класса является бесплатная Xenu\\'s Link Sleuth, которая вдобавок еще и инсталляции не требует. Работает она очень шустро и создает удобный отчет в HTML-формате с указанием всей необходимой информации об обнаруженных ошибках.
Очень часто встречающейся причиной сбойных ссылок является несоблюдение регистра. Дело в том, что Unix (который используется на большинстве интернет-серверов), в отличие от Windows, различает регистр в именах файлов. Поэтому, если файл у вас называется Page.htm, а в ссылке прописано <a href="page.htm">, то в Windows (в частности, при тестировании на вашей домашней машине) все будет работать, а вот как только документ попадет в Интернет, то вылезет та самая 404-я ошибка... Регистр стоит соблюдать и в том случае, если ваш сервер работает под Windows — ведь не исключено, например, что вы впоследствии захотите перенести свой сайт к другому провайдеру или организовать зеркало... А менять кучу документов в «авральном режиме» — не самое приятное времяпрепровождение...
Еще одной распространенной ошибкой является использование обратного слеша (\) вместо прямого (/) в адресах. Большинство современных браузеров «наслышано» об этой привычке начинающих веб-мастеров, и в большинстве случает программа правильно догадывается о том, куда они хотели послать посетителя. Но так делают не все. Да и некоторые программы или скрипты, работающие на сервере, могут отказаться обрабатывать такие ссылки. Так что уделяйте этому внимание...
Наконец, стоит предусмотреть возможность того, что при ручном наборе адреса опечатается посетитель — если при просмотре логов сервера вы часто встречаете одни и те же опечатки, то добавьте их к скрипту error.php (о нем речь пойдет в конце заметки).
Изменение навигации
Очень много проблем и ошибок вызывает изменение навигации и структуры сайта. Например, есть у вас сайт со статьями. И все статьи вы выкладываете в корень с именами article1.html, article2.html и так далее. Соответственно, адрес этих статей — /redir.php?url=www.mysite.ru%2Farticle1.html%2C /redir.php?url=www.mysite.ru%2Farticle2.html... И все работает хорошо, но в какой-то момент вы вдруг решаете перенести все статьи в отдельную директорию. Соответственно, адреса статей меняются на /redir.php?url=www.mysite.ru%2Farticles%2Farticle1.html. Вы тщательно правите все ссылающиеся документы, проверяете сайт линк-валидатором, и все, вроде бы, работает прекрасно, но... У кого-то в папке «Избранное» сохранилась старая ссылка, кто-то нашел старую распечатку вашего сайта, поисковики сохраняют скешированные страницы... И все это приводит к тому, что посетителям выдается все та же знаменитая 404-я ошибка...
При смене расположения документов на сервере удобно использовать mod_rewriteТрадиционным (и очевидным) методом решения подобного типа проблем является перенаправление посетителя на нужную страницу. Однако практика показывает, что в большинстве случаев это перенаправление производится не совсем правильно.
Дело в том, что, когда сервер получает от браузера запрос на показ какого-то документа, он сначала посылает в ответ всяческие служебные заголовки, среди которых находится код ответа. Этот код обозначает результат обработки запроса (в частности, 404 — именно код ответа). Наиболее распространенными кодами являются 200 (все прошло гладко, ошибок не обнаружено), 301 (документ постоянно перемещен на другой адрес), 302 (документ временно перемещен на другой адрес) и 404 (документ не найден).
Так вот, чаще всего для переадресации посетителя используется либо mod_rewrite (который просто «втихую», то есть незаметно для пользователя, изменяет адрес и возвращает затребованный документ), либо клиентский скрипт (о том, как его создать и подключить — ниже), который использует что-то вроде PHP-команды
header("Location: /redir.php?url=www.mysite.ru%2Farticles%2Farticle1.html");
Проблема же заключается в том, что в первом случае посетитель получает код ошибки 200 (и считает, что все прошло правильно), а во втором — 302 (и опять же, считает, что все в порядке). На первый взгляд, в этом нет ничего страшного — посетитель видит правильную страницу, сервер не отмечает никаких ошибок, и все работает прекрасно. Но вот поисковики при таком ответе сохраняют «старые» ссылки, браузеры и всякие роботы — тоже... Причем особенно актуален вопрос именно с поисковиками. Дело в том, что при выдаче результатов поиска они ориентируются на популярность вашей страницы, учитывая количество ссылок, на эту страницу указывающих. Но для поисковика /redir.php?url=www.mysite.ru%2Farticle1.html и /redir.php?url=www.mysite.ru%2Farticles%2Farticle1.html%26nbsp%3B%26mdash%3B это две разные страницы! И если половина ссылок использует старый адрес, а половина — новый, то для поисковика популярность вашей страницы окажется вполовину заниженной. А если на вашем сайте страницы генерируются динамически, да еще и используют относительную адресацию (вида <a href="article2.html">), то при использовании старого адреса посетитель (и поисковик!) увидит ссылку <a href="/redir.php?url=www.mysite.ru%2Farticle2.html">... Не говоря уже о том, что все подобные ссылки будут считаться правильными и сохраняться поисковиками, и когда через год-другой вы снова поменяете навигацию и удалите переадресацию «очень старых» ссылок, то обнаружите множество 404-х ошибок в логах...
При переадресации правильнее использовать код ошибки 301, а не 302Отсюда ясно, что намного правильнее использовать код ошибки 301, чтобы указать, что страница переехала постоянно. К счастью, сделать это совсем несложно — при использовании mod_rewrite достаточно написать, например
RewriteRule ^/(article[0-9]+\.html) /articles/$1 [R=301, L]
а при использовании PHP-скрипта
header("HTTP/1.1 301 Moved Permanently");
header("Location: /redir.php?url=www.mysite.ru%2Farticles%2Farticle1.html");
Если же вы, наоборот, хотите, чтобы внешне все оставалось неизменным, то надо использовать «внутренний» редирект — то есть просто менять адрес вызываемого документа. Скажем, если статьи из предыдущего примера вы перемещали в отдельную директорию только для собственного удобства, то в mod_rewrite надо написать
RewriteRule ^(article[0-9]+\.html) /articles/$1 [L]
Удаление страниц
Как известно, если сайт не обновляется, то он весьма быстро теряет свою аудиторию. А если обновляется, то рано или поздно, но документы на нем устаревают и удаляются. Но старые ссылки сохраняются в самых разных местах и довольно регулярно «всплывают» — я, например, до сих пор регистрирую заходы на сайт по ссылкам, которые уже лет шесть как не существуют!
Что же делать, если посетитель интересуется документом, которого все равно уже нет? Можно, конечно, не делать ничего и совершенно честно показать ему стандартную 404-ю страницу. Но лучше будет эту страницу оформить как-то более интересно — например, кратко сказать о вашем сайте и о том, что на нем можно найти, предложить посмотреть какие-то близкие по теме документы или, на худой конец, какой-нибудь анекдот вывести, чтобы посетителю было не так обидно. А еще лучше при удалении старого документа оставить на его месте уведомление о том, что он был удален по таким-то и таким-то причинам, а аналогичная, но более свежая версия находится там-то и там-то — в этом случае даже 404-я ошибка появляться не будет.
«Собственноручная» обработка 404-й ошибки достаточно легко реализуется с помощью скриптов и директивы ErrorDocument сервера Apache. Например, если в конфигурации своего сервера вы напишете:
ErrorDocument 404 error.php
то при возникновении 404-й ошибки посетителю будет показана не стандартная «ошибочная» страница, а ваш скрипт. Что именно этот скрипт будет делать — решать вам, я же попробую подкинуть несколько идей:
Вот, пожалуй, и все. Успехов вам и вашему сайту! И чтобы свеженаписанный error.php почаще простаивал без работы!
Ссылки по теме
Статья получена: hostinfo.ru