Директива Apache ErrorDocument не перенаправляет
У меня есть куча директив 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 Access Log отмечает нормальный заголовок 200 OK, и все же он полностью игнорируется .htaccess.
Ответы
Ответ 1
Несколько разных ошибочных представлений в вопросе. Следующий код 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 script, который выйдет из строя:
#!/usr/bin/perl
safasfdsfdd_(*EYFIUOBAF(_*AS^FD_(*AWHD{
Вам нужно будет убедиться, что perl script является исполняемым пользователем apache. Это показывает мой пользовательский обработчик 500.
Тем не менее, вы вряд ли когда-либо запускаете Apache 500 при использовании PHP, поэтому это, вероятно, не является полезным тестом.
Ответ 2
Я просто использую .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