2011-12-14 4 views
2

Я использую Apache 2.2.X и PHP 5.2.X (установленный как модуль Apache) для создания нового веб-сайта, и я хотел бы прочитать ваши предложения о том, как я пытаюсь обрабатывать серверных ошибок.
Я думал о том, чтобы использовать тот же файл моей домашней страницы (/index.php), чтобы показывать пользовательские сообщения об ошибках. Это мой .htaccess установка:Index.php как пользовательская страница ошибки

ErrorDocument 400 /index.php?error=400 
ErrorDocument 401 /index.php?error=401 
ErrorDocument 403 /index.php?error=403 
ErrorDocument 404 /index.php?error=404 
ErrorDocument 500 /index.php?error=500 

Теперь в моем файле index.php У меня есть некоторый код, который выглядит следующим образом:

if (isset($_GET['error'])) 
    DrawErrorPage($_GET['error']); 
else 
    DrawHomepage(); 

Все работает как шарм.
Ну, все, кроме одной вещи, которую я не могу исправить: если я заставляю Apache отвечать кодом состояния 500 (например, вставляя неверный код в мой .htaccess), я не перенаправляюсь на «/index.php ? error = 500 ", но вместо этого я получаю страницу с ошибкой по умолчанию 500. С любым другим кодом состояния (например, 403 или 404) моя конфигурация работает абсолютно отлично.

Но теперь у меня есть сомнения, и я начинаю думать, что было бы лучше использовать другую страницу для обработки ошибок (например, «/error.php»).
«DrawHomepage()» необходимо установить метатег «robots» в «index, follow», тогда как «DrawErrorPage()» необходимо установить его в «noindex, nofollow». Правильно? Итак ... что произойдет, если веб-искатель получит сообщение об ошибке, впервые посетив мою домашнюю страницу? Что произойдет, если веб-искатель получит 200 посещений моей домашней страницы в первый раз, но 500 посещений его через месяц? И что произойдет, если я сохраню метатег «robots» в «index, follow», даже если я покажу ошибки?

Есть ли обходной путь, решение, для решения этой проблемы? Что бы вы сделали?

Большое спасибо!

ответ

4

Обычно, если есть код 500 статуса, то Apache испортил что-то и он не может запустить файл index.php, в результате чего другого кода состояния 500. Apache продолжает этот цикл ошибок для нескольких итераций, прежде чем он, наконец, произнесет «no more loops» и отправит собственную страницу ошибок.

Единственный действительно безопасный способ отображения пользовательской страницы для кода состояния 500 - использовать обычный текст или использовать базовый файл .html или .shtml, который не пытается получить доступ к другим вещам на вашем сервере, поэтому вы не Продолжайте вызывать более 500 кодов состояния при загрузке страницы.

Обычно, если искатель встречает 500, он будет временно игнорировать страницу. Код 500 можно восстановить, это не обязательно означает, что там нет страницы, только что сервер перепутался на данный момент. Боты умны и могут определять, что означает коды ошибок, если страница всегда , отправив код состояния в заголовке страницы.

Помните, что если вы используете PHP файл в качестве ошибки документа, вам необходимо отправить код состояния HTTP с помощью функции заголовка внутри PHP для обеспечения правильного обнаружения страниц, например, так:

header("HTTP/1.1 404 Page Not Found"); 
+1

Хорошего замечания о повторной отправке коды состояния. – FakeRainBrigand

+0

Так, например, если я печатаю ошибку 403 на своей странице, мне также нужно отправить заголовок 403 правильно? Что касается искателей и временных ошибок, все в порядке, я понимаю ... но это также работает, если пользователь вводит, например, «/non-existant.gif» и перенаправляется на «/index.php?error=400»? Что случилось бы? Crawler поражает index.php и получает код состояния 404 ... не так плохо для индексирования? И какой метатег «роботов» следует использовать в обоих случаях? –

+0

Когда пользователь попадает в файл, у него также нет доступа или нет, независимо от причины, страница фактически не перенаправляется. URL-адрес в адресной строке остается неизменным, а * файл, который был выполнен *, изменяется с помощью Apache.Этот файл может хранить данные об ошибке, отображать пользовательскую страницу, но также необходимо отправить соответствующий код ошибки (например, 404), чтобы боты или кто бы ни обращался к нему, перестанут пытаться получить к нему доступ. Вы не говорите, что index.php не существует, вы говорите, что путь, к которому они обращались, не существует. Я не уверен, что вы подразумеваете под метатегами роботов. – animuson