Как определить, какая страница вызвала внутреннюю ошибку сервера?

Итак, в моем файле .htaccess у меня есть строки ErrorDocument:

ErrorDocument 500 http://www.example.com/500

Поскольку на моем сервере работают несколько веб-сайтов из одних и тех же файлов ядра, я просто хочу перенаправить все внутренние ошибки сервера на одну и ту же страницу обработки. Однако моя проблема в том, что он не отправляет никакой информации о странице, которая вызывает ошибку, а перенаправляет страницу. Я попытался изменить его на ErrorDocument 500 index.php?500, но это просто вызывает вторую внутреннюю ошибку сервера при попытке найти файл. Любые идеи о том, как я могу успешно перенаправить его на свою пользовательскую страницу с ошибкой 500 и при этом получить информацию о странице, которая вызвала ошибку в первую очередь?


person animuson    schedule 11.07.2010    source источник
comment
Что вы хотите обработать? Какая польза от этой информации о странице вызывающего абонента?   -  person Your Common Sense    schedule 18.07.2010
comment
Это страница с ошибкой, однако, когда вы включаете http впереди, Apache перенаправляет на эту страницу вместо того, чтобы оставаться на URL-адресе, где она произошла, поэтому данные об ошибке отсутствуют.   -  person animuson    schedule 18.07.2010


Ответы (4)


В своем заявлении ErrorDocument вы указываете URL-адрес удаленной страницы. В результате Apache отправляет пользователю заголовок Location, и пользователь идет своим путем.

Вместо этого измените URL-адрес на абсолютный путь к локальному сценарию, который будет обрабатывать ошибку:

ErrorDocument 500 /500.php

Сценарий должен быть запущен с набором переменных среды, начинающихся с REDIRECT_, которые должны содержать различные пути и строки запроса, связанные с ошибкой.

Невозможно отправить пользователя в другое место, а также получить информацию внутри самого ErrorDocument. С другой стороны, ваш сценарий может захватить информацию, а затем перенаправить пользователя, если вы по какой-то причине все еще хотите обрабатывать ее таким образом.

person Charles    schedule 19.07.2010

Вы всегда можете посмотреть в поле referrer http-запроса, чтобы определить, по какому URL-адресу вызывающий абонент был до этого.

person Gab Royer    schedule 19.07.2010

Проверьте журнал доступа вашего веб-сервера. Там вы сможете увидеть, какой запрос вызывает код ответа 500.

В Apache (с использованием формата журнала по умолчанию) успешный запрос (200 OK) может выглядеть так:

127.0.0.1 - - [19/Jul/2010:18:25:54 +0200] "GET / HTTP/1.1" 200 663 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8pre) Gecko/20100718 Ubuntu/10.04 (lucid) Namoroka/3.6.8pre"

Запрос, результатом которого является 500, может выглядеть так:

127.0.0.1 - - [19/Jul/2010:18:24:37 +0200] "GET / HTTP/1.1" 500 631 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8pre) Gecko/20100718 Ubuntu/10.04 (lucid) Namoroka/3.6.8pre"

Код ответа находится в шестом столбце.

Вы также можете проверить свой журнал ошибок PHP, который будет содержать все ошибки PHP, если вы включили ведение журнала ошибок (вы должны это сделать).

person Daniel Egeberg    schedule 19.07.2010
comment
Однако я не хочу обнаруживать это постфактум, я хочу, чтобы PHP обнаруживал его прямо здесь и выполнял с ним свою собственную обработку. - person animuson; 19.07.2010

Ваш сервер Apache регистрирует каждую ошибку (хотя это настраивается). Вы можете открыть этот файл и управлять им с помощью FileStream в вашем PHP. интернет сайт. См. http://httpd.apache.org/docs/2.2/logs.html, чтобы узнать больше о файле журнала Apache. Вы можете получить руководство по .htaccess по адресу http://www.freewebmasterhelp.com/tutorials/htaccess/ .

Чтобы сделать свою собственную обработку, создайте файл PHP, например error.php, который будет обрабатывать ваши ошибки. Вы можете перенаправить его с помощью файла .htaccess. После этого, если вы хотите перейти на страницу, вы можете сделать это с помощью header()< /а> метод.

person chanchal1987    schedule 20.07.2010