Intereting Posts
Как получить категории, имеющие отношение к пользователю? PHP – Возвращает последнюю строку в файле? Лучший способ создания абсолютного пути в PHP? (См. 3 метода, перечисленных внутри) Различия между классами запроса PHP – количество циклов выбранных флажков в форме submit Facebook: сообщение на странице как вопрос страницы (токен доступа / php) Добавить атрибуты в краткое описание в WooCommerce 3.0+ Невозможно загрузить видео в учетную запись пользователя facebook с помощью Graph API отключить трассировку стека PHP Как построить расширение PHP, которое выполняется во многих версиях PHP? Изменение ereg_replace до эквивалентного preg_replace разница между вызовом по значению и вызовом по ссылке в php, а также $$ означает? Как получить доступ к переменной в классе PHP, заданной другой функцией? Codeigniter Фильтрация входных форм PHP WAMPserver – почему стек установлен с двумя файлами php.ini?

Директива 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 имеется обычный заголовок 200 OK, и все же он полностью игнорируется .htaccess.

Несколько разных ошибочных представлений в вопросе. Следующий код 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, поэтому это, вероятно, не является полезным тестом.

Я просто использую .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