Директива Apache ErrorDocument не перенаправляет - PullRequest
13 голосов
/ 23 апреля 2011

У меня есть куча директив ErrorDocument в моем файле .htaccess для того, чтобы отлавливать почти все возможные ошибки, которые Apache может выдать пользователю, и перенаправить указанного пользователя в мой контроллер ошибок, который затем отобразит ошибку в большем количестве пользователей.дружелюбная манераОднако, это не похоже на работу.

Например, когда я ввожу недопустимый URL-адрес, такой как mysite.com/""##$##$!Я всегда получаю сообщение об ошибке Apache по умолчанию 403 вместо перенаправления на мой файл errors.php.Ниже указана директива, которую я использую.Нужно ли что-то еще делать, чтобы это работало?(AllowOverride All установлен)

   ErrorDocument 403 /errors.php

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

СпасибоВы!

Редактировать: О, просто подумал, что я упомяну это.Я написал свою собственную структуру MVC для перенаправления запроса, и она работает хорошо.Изнутри PHP, если пользователь запрашивает несуществующий URL, моя собственная ошибка 404 будет срабатывать очень хорошо (или любая другая ошибка, которую я определил).Так что в основном, если я захожу на mysite.com / !!!!в URL, он будет работать, и я получу 404. Однако всякий раз, когда я запускаю запрос с символом двойной кавычки, запускается ошибка Apache 403 по умолчанию.Странный.Кроме того, ошибка 500 не сможет перенаправить также на errors.php и просто вернет экран Apache 500 по умолчанию (например, при тестировании с заголовком («HTTP / 1.0 500 Internal Server Error»); die ();).

Редактировать 3: Я только что попытался поместить ErrorDocument 200 "message" в мой файл .htaccess, и ничего не произошло, любая открытая страница открывается нормально.В худшем случае это должно застрять в бесконечном цикле.В лучшем случае, он должен вывести «сообщение».Он не сделал ни того, ни другого, просто проигнорировал ErrorDocument.В журнале доступа Apache отмечается нормальный заголовок «200 OK», но он полностью игнорируется .htaccess.

Ответы [ 2 ]

27 голосов
/ 30 апреля 2011

Несколько разных заблуждений в вопросе.Следующий код PHP:

header("HTTP/1.0 500 Internal Server Error");
die();

Никогда не будет вызывать страницу ошибок Apache - она ​​вызывает страницу ошибок вашего браузера по умолчанию.После того, как управление передано PHP, оно не возвращается к Apache для обработки ошибок.

ErrorDocument работает только для кодов ошибок, но не для кодов успеха.Он находится в документации

Syntax: ErrorDocument error-code document

http://httpd.apache.org/docs/current/mod/core.html#errordocument

Если вы ошиблись в одном виде страницы с ошибкой браузера за ошибку сервера, то это может быть причиной вашей основной проблемы.Если ваш пользовательский обработчик ошибок не выводит определенный объем данных, некоторые браузеры всегда будут отображать свои собственные страницы ошибок.Убедитесь, что размер выходных данных составляет не менее нескольких килобайт.

Причина вашей проблемы, скорее всего, заключается только в встроенном поведении Apache в сочетании с выбором тестовых URL-адресов.Из документов ErrorDocument:

Хотя большинство сообщений об ошибках могут быть переопределены, существуют определенные обстоятельства, когда внутренние сообщения используются независимо от настройки ErrorDocument.В частности, если обнаружен некорректный запрос, обычная обработка запроса будет немедленно остановлена, и будет возвращено внутреннее сообщение об ошибке.Это необходимо для защиты от проблем безопасности, вызванных неверными запросами.


Редактировать: Как смоделировать ошибку 500 в Apache.Моей первой мыслью были синтаксические ошибки в .htaccess, но это не вызывало пользовательских обработчиков ошибок.Самым простым способом, который я нашел, было включить CGI в .htaccess, добавив следующие строки:

ErrorDocument 500 /500.php
Options +ExecCGI
AddHandler cgi-script .pl

, а затем добавив сбой сценария perl:

#!/usr/bin/perl
safasfdsfdd_(*EYFIUOBAF(_*AS^FD_(*AWHD{

.уверен, что скрипт perl исполняется пользователем apache.Здесь показан мой пользовательский обработчик 500.

Однако вы вряд ли когда-либо будете запускать Apache 500 при использовании PHP, так что это, вероятно, бесполезный тест.

0 голосов
/ 06 июля 2011

Я просто использую .htaccess для всех пользовательских страниц с ошибками

ErrorDocument 401 /error/PHP/server-error.php?error=401

ErrorDocument 403 /error/PHP/server-error.php?error=403

ErrorDocument 404 /error/PHP/server-error.php?error=404

ErrorDocument 500 /error/PHP/server-error.php?error=500

ErrorDocument 503 /error/PHP/server-error.php?error=503
...