Как я могу вызвать 500 Внутренняя ошибка сервера или 404 страница не найдена Апача ошибок в PHP?
За 500 Внутренняя ошибка сервера я пробовал следующий код :
header("HTTP/1.0 500 Internal Server Error");
Но он показывает мне пустую страницу. Как я могу показать сообщение об ошибке в Apache'формат по умолчанию?
Пожалуйста, руководство..
Вы могли бы просто скопировать страницы ошибок Apache в корневом web-каталоге (или ссылку на них) и использовать заголовок()
для установки коды ошибок и с этими документами в качестве выходного. Что'ы, вероятно, лучше, если у вас нет веской причины не делать этого. Но в случае, что выиграл't работа для вас, есть несколько альтернатив (хотя, богатство альтернатив).
За 500, просто поставить ошибка в коде.
<?php throw new Exception('Nooooooooooooooo!'); ?>
Скрипт PHP будет вызывать исключение, в результате чего в обычный Апач 500 страницу ошибки. (Но следует учитывать нюанс, что это только приведет к ошибке в Apache, если PHP инициализации параметр что display_errors
имеет значение 0
. В большинстве конфигураций развития, это не тот случай. В большинстве производственных конфигураций, это так. Если вы Don'т знаете свой рабочий сервер'ы настройки, вы'll должны просто проверить, чтобы увидеть, если он работает.)
Для 404, я думаю, лучшее, что вы можете сделать, это перенаправление на несуществующую страницу. Это's не то же самое, но могли бы сделать для ваших целей.
<?php header("Location: /i-dont-think-therefore-i-am-not"); ?>
В большинстве браузеров, пользователи выиграли'т на самом деле перенаправление, они просто молча и быстро попадете на несуществующую страницу, в результате чего в обычный Апач ошибка 404. Конечно, URL-адрес будет изменен, и некоторые пользователи могли заметить, что. Если это's не приемлемо, вы можете, возможно, достичь подобных результатов с помощью Apache и mod_rewrite, чтобы переписать URL-адрес серверной несуществующий.
Чтобы ответить на некоторые замечания: параметр код ответа с помощью функции header () (или другим способом) не приведет в стандартном документе ошибка Апача. Он будет просто возвращать код ответа с собственного вывода. Это намеренное поведение, разработаны таким образом, что вы можете иметь пользовательские страницы ошибок, или в противном случае установить коды ответов, как в HTTP спецификации диктует на любой запрос. Если вы хотите, чтобы Апач ошибки в документах, вам придется либо их подделывать (как на мое первоначальное предложение просто копируя ошибки документов в веб-корень), или вы'будете иметь, чтобы обмануть Apache в их возвращения (как на мой резервный предложение).
После такого знания-полное обсуждение, я думаю, что нет PHP-код может отображаться по умолчанию 500 Внутренняя ошибка сервера. Решение :
<IfModule mod_rewrite, с.с> RewriteEngine На RewriteCond %{REQUEST_FILENAME} -д RewriteRule ^])(.(*/ RewriteRule ^])((а-з
заголовок('расположение : 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?
}
Тем не менее, вы должны буферизацию вывода, чтобы иметь возможность использовать заголовка PHP функция()
после использования любой функции вывода Как "Эхо".
Я'м, наверное, довольно поздно, но это решение должно работать
header("HTTP/1.0 500 Internal Server Error");
include("/path-to-public-html/errors/500.php");
die();
Это приведет к 500 отклика Исэ, и показать на 500 страницу ошибки по умолчанию, то остановить скрипт. Очевидно, вам потребуется изменить расположение файла
вы просто не можете вызвать Апач ошибка страницы из PHP-код без шаманства перенаправление как предложил Бен ли, потому что ошибка в документе перенаправление обрабатывается другой слой приложения's в стек (в частности, Апач'ы mod_core). когда скрипт запускается, он's слишком поздно.
надувательство получить страницу ошибки, сильно выдавая исключение, зависит от вашего PHP.Ини'параметры s о обработка ошибок и многословие.
`http_response_code () в настоящее время существует только в PHP's, таким образом, СВН это's не доступны в большинстве рабочих сред, которые должны выполнить официальной версии.
мой совет заключается в том, чтобы правильно реализовать пользовательский обработчик ошибок и исключений с помощью set_error_handler()и
set_exception_handler()`, соответственно, использовать функцию header () для отправки правильного клиента, информацию о статусе HTTP и (при необходимости) создать страницы ошибок.
Я знаю, что это старый нить...
Вы могли бы сделать элемент iframe на ваш взгляд, а затем задать его высоту и ширину в 100%, в случае ошибки вы готовитесь к ручке.
в <?в PHP заголовок("по протоколу HTTP/1.0 500 Внутренняя ошибка сервера ошибка"); 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>
В результате соответствующего кода ошибки для всех пользователей, а также трассировку стека для разработчиков, если вы установите переменную окружения $до 'Дев' на ваш стек разработки.
Нет редиректа, без шаманства, защищенной, если вам нужно, чтобы разоблачить ошибки он выиграл'т. :)
Видимо, есть функция под названием http_response_code, что позволит вам правильно настроить код ответа. Если это не't работа (там'с отметкой в документации об этом, возможно, только в SVN), то заголовок функции может иметь необязательный аргумент код ответа:
header("HTTP/1.0 ...", true, 404);
Это должно корректно сигнала Апач.
На PHP 5.5 => "в заголовке("и тестер.на PHP" был,правда,500);", где tester.php не существует. Он работает и берет меня на 500 страниц :)
К сожалению, ни один из других методов, перечисленных здесь работал для меня по одной причине или другой.
Я знаю, что это старый нить, но когда я искал в Google, он прыгает, как первый ответ. Я пытаюсь выяснить, как сделать это в эти дни, так что я думаю, я должен разместить мой обходной с 2018 года.
Как вам всем уже известно, нет, вы не можете просто вызвать страницы ошибок веб-сервера Apache с PHP. Нет никакого способа делать это. Поэтому лучшее решение я смог найти, после некоторых исследований, составляет чтобы использовать PHP функцию для отображения настраиваемых страниц ошибок, которая называется от того, что вы указали в Apache, а страница, на которую вы хотите вызвать 500 Внутренняя ошибка сервера.
Вот мой conf
и Апачу:
ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 500 /error.php
Как вы могли видеть, все 4хх и 500 ошибки передаются в одном файле php. Почему я не использую отдельные файлы для каждого кода-это другой вопрос, который не имеет ничего общего с вашим вопросом здесь, так что давай забудем это и делать упор на error.php на данный момент.
Вот несколько строк из error.php`:
<?php
require_once("error_page.php");
$relative_path = "";
$internal_server_error = FALSE;
if (isset($_SERVER['REDIRECT_URL']) && $_SERVER['REDIRECT_URL'] != "")
{
$relative_path = $_SERVER['REDIRECT_URL'];
$internal_server_error = (http_response_code() >= 500);
}
else if (isset($_SERVER['REQUEST_URI']))
{
$relative_path = $_SERVER['REQUEST_URI'];
}
ErrorPage::GenerateErrorPage($internal_server_error, $relative_path);
?>
Короче, он получает код состояния HTTP из Apache через http_response_code (), и просто разделить код на две категории: Внутренняя ошибка сервера и номера-Внутренняя ошибка сервера. Затем она проходит по категории ErrorPage::GenerateErrorPage ()
, который на самом деле генерирует содержание страницы ошибки.
В ErrorPage::GenerateErrorPage()`, я делаю что-то вроде этого:
<?php
http_response_code($internal_server_error ? 500 : 404);
?>
в начале функции, так что не будет никаких раздражающих “уже отправлены заголовки”. Эта функция будет генерировать полностью функциональную страницу ошибки с правильным (или то, что мы ожидали, по крайней мере) код состояния HTTP. После установки кода состояния HTTP, как вы догадываетесь, один из двух подготовленных содержание будут генерироваться следующие коды PHP, один за 500, другой за 404.
Теперь давайте вернемся к вашему вопросу.
Вы хотите, чтобы вызвать точно такую же ошибку страницы, как Apache, и теперь вы можете просто позвонить в ErrorPage::GenerateErrorPage () от где вы хотите, как долго, как вы дать ему нужные параметры (
правдаза 500,
false` в 404 в моем случае).
Очевидно, потому, что страницы ошибок Apache и создаются ErrorPage ту же функцию:: GenerateErrorPage()
, мы можем гарантировать, что то, что вы запускаете, где именно то, что вы ожидаете от страницы ошибок Апача.
Вот мой пример триггера страница:
<?php
ob_start();
require_once("error_page.php");
try
{
// Actual contents go here
phpInfo();
throw new Exception('test exception');
}
catch (Exception $e)
{
ob_clean();
ErrorPage::GenerateErrorPage(TRUE);
ob_end_flush();
exit();
}
ob_end_flush();
?>
Причина, почему я использовать ob_start()и
ob_clean () заключается в том, что, таким образом, я могу очистить все выходные до возникновения исключения, и послать чисто 500 Внутренняя ошибка сервера страницу, которая выглядит точно так же, как Apache дает, без какой-либо контент на странице триггер (функцию phpinfo()
в этом случае). ob_start()
и ob_clean()также **убедитесь, что там не будет “заголовки уже отправлены”**, потому что ничего никогда не будет отправлено, если вы называете ob_end_flush()
.
Решение данной проблемы-вывод из того, что я исследовал эти дни. Это до сих пор так хорошо для меня, но я не уверен, если это правильный способ сделать это. Любые комментарии, вопросы, мысли, пожелания и улучшения приветствуются.