Как я могу запустить 500 внутренних ошибок сервера или 404 страницы Не найденные ошибки Apache в PHP?
Для 500 внутренних ошибок сервера я пробовал следующий код:
header("HTTP/1.0 500 Internal Server Error");
Но это показывает мне пустую страницу. Как я могу показать ошибку в формате по умолчанию для Apache?
Пожалуйста, направляйте ..
Вы можете просто скопировать документы об ошибках Apache в свой корневой каталог (или их символическую ссылку) и использовать header()
для установки кодов ошибок и с этими документами в качестве вывода. Это, наверное, лучше, если у вас нет веских причин. Но в случае, если это не сработает для вас, есть несколько альтернатив (хотя и хакерских альтернатив).
Для 500 просто введите ошибку в свой код.
<?php throw new Exception('Nooooooooooooooo!'); ?>
PHP-скрипт вызовет исключение, что приведет к регулярной странице ошибок Apache 500. (Но имейте в виду, что это приведет только к ошибке Apache, если для параметра PHP init display_errors
установлено значение 0
В большинстве конфигураций разработки это не так. В большинстве производственных конфигураций это так. не знаете настройки вашего производственного сервера, вам нужно просто проверить это, чтобы убедиться, что он работает.)
Для 404 я думаю, что лучшее, что вы можете сделать, это перенаправить на несуществующую страницу. Это не совсем то же самое, но может сделать для ваших целей.
<?php header("Location: /i-dont-think-therefore-i-am-not"); ?>
В большинстве браузеров пользователи фактически не видят перенаправление, они просто будут тихо и быстро перенаправляться на несуществующую страницу, что приведет к обычной ошибке Apache 404. Конечно, URL-адрес изменится, и некоторые пользователи могут это заметить. Если это неприемлемо, вы можете достичь аналогичных результатов с помощью Apache mod_rewrite, чтобы переписать бэкэнд url в несуществующее место.
Чтобы ответить на несколько комментариев: установка кода ответа с помощью header()
(или каким-либо другим способом) не приведет к стандартному документу об ошибке Apache. Он просто вернет этот код ответа с вашим собственным выходом. Это преднамеренное поведение, спроектированное таким образом, что вы можете создавать собственные файлы ошибок или иным образом устанавливать коды ответов, поскольку спецификация HTTP задает любой запрос. Если вам нужны документы об ошибках Apache , вам нужно либо подделать их (согласно моему первоначальному предложению просто скопировать документы с ошибкой в ваш корневой каталог), либо вам придется обмануть Apache в их возврате (согласно моему предложению резервного копирования) ,
После такого всестороннего обсуждения, я думаю, что php-код не может отображать по умолчанию 500 Internal Server Error. Решение:
1. Создайте папку с именем http500 рядом с файлом php.
2. Создайте в нем файл .htaccess и добавьте следующий код:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^])(.(*/ RewriteRule ^])((a-zA </IfModule>
header ('location: http500 /');
function ISE() { header('HTTP/1.1 500 Internal Server Error', true, 500); trigger_error('ISE function called.', E_USER_ERROR);//if you are logging errors? }
Тем не менее, вам понадобится буферизация вывода ON, чтобы иметь возможность использовать функцию php header()
после использования любой выходной функции, такой как echo
.
Я, вероятно, довольно поздно, но это решение должно работать
header("HTTP/1.0 500 Internal Server Error"); include("/path-to-public-html/errors/500.php"); die();
вheader("HTTP/1.0 500 Internal Server Error"); include("/path-to-public-html/errors/500.php"); die();
Это вызовет ответ 500 ISE и покажет страницу ошибки 500 по умолчанию, а затем остановит сценарий. Очевидно, вам нужно будет изменить расположение включенного файла
вы просто не можете запускать страницы ошибок apache из php-кода без перенаправления хакеров, как было предложено ben lee, поскольку перенаправление документов с документами обрабатывается другим уровнем стека приложения (в частности, mod_core от apache).
когда ваш скрипт работает, уже слишком поздно.
хитрость получения страницы с ошибкой путем значительного исключения исключения зависит от настроек вашего php.ini об обработке ошибок и многословности .
http_response_code()
настоящее время существует только в svn php, поэтому он недоступен в большинстве производственных средах, которые должны запускать официальную версию.
мой совет состоит в том, чтобы надлежащим образом реализовать собственный обработчик ошибок и исключений с помощью set_error_handler()
и set_exception_handler()
, соответственно, использовать header()
для отправки надлежащей информации о состоянии http-клиента и (при необходимости) генерации страниц ошибок.
По-видимому, есть функция http_response_code , которая позволит вам правильно установить код ответа. Если это не работает (есть примечание в документации о том, что оно возможно только в SVN), то функция header
может принимать необязательный аргумент кода ответа:
header("HTTP/1.0 ...", true, 404);
Это должно правильно сигнализировать Apache.
На PHP 5.5 => "header (" tester.php ", true, 500);" где tester.php не существует. Он работает и берет меня на мою 500-страничную страницу 🙂
К сожалению, ни один из других методов, перечисленных здесь, не работал для меня по той или иной причине.
Я знаю, что это старый поток, однако …
Вы можете отобразить элемент iframe в своем представлении, а затем установить его высоту и ширину на 100% в случае ошибки, которую вы собираетесь обрабатывать.
<?php header("HTTP/1.0 500 Internal Server Error"); http_response_code(500); ?>
<iframe src="page_displaying_apache_screenshot_fullscreen.html"></iframe>
СЧИТАЕТ
Я действительно считаю, что лучшим современным решением для этого было бы что-то вроде:
<?php header("HTTP/1.0 500 Internal Server Error"); http_response_code(500); ?> <div class="panel-body"> <h1>Error!</h1> <p> <?php // Then, in the view if your in dev env, print exception and stack trace if ($env === 'dev') { throw new Exception('Uh oh! Something broke while adding a new user the db.'); } else { echo "Hold your butts, an error has occured."; die(); } ?> </p> </div>
Это приведет к созданию надлежащего кода ошибки для всех пользователей, а также трассировки стека для dev, если вы установите переменную $ env в «dev» в стеке dev.
Нет переадресации, без взлома, безопасности, если вам не нужно выставлять ошибку, это не будет. 🙂