Вызвать 500 внутренних ошибок сервера в PHP и отобразить страницу ошибок Apache

Как я могу вызвать 500 Внутренняя Ошибка Сервера или 404 Страница Не Найдена ошибки Apache в PHP?

для 500 внутренних ошибок сервера я попробовал следующий код:

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

но он показывает мне пустую страницу. Как я могу показать ошибку в формате Apache по умолчанию?

пожалуйста, руководство..

9 ответов


вы можете просто скопировать документы об ошибках 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 внутренних ошибок сервера. Решение таково:
1. Создайте папку с именем http500 рядом с файлом PHP.
2. Создать .htaccess файл и добавить следующий код :

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^])(.(*/
    RewriteRule ^])((a-zA
</IfModule>
  1. PHP код перенаправления:

заголовок ('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?
}

однако вам понадобится буферизация вывода, чтобы иметь возможность использовать php header() функция после использования любой выходной функции, такой как echo.


Я, наверное, довольно поздно, но это решение должно работать

header("HTTP/1.0 500 Internal Server Error");
include("/path-to-public-html/errors/500.php");
die();

это вызовет ответ 500 ISE и покажет страницу ошибки 500 по умолчанию, а затем остановит сценарий. Очевидно, вам нужно будет изменить местоположение включенного файла


вы просто не можете запускать страницы ошибок apache из php-кода без перенаправления хакеров, как предложил Бен ли, потому что перенаправление документов ошибок обрабатывается другим слоем стека вашего приложения (в частности, apache mod_core).
когда сценарий запускается, слишком поздно.

хитрость получения страницы с ошибкой путем создания исключения сильно зависит от вашего php.настройки ini о обработка ошибок и многословие.

http_response_code()в настоящее время существует только в svn php, поэтому он недоступен в большинстве производственных сред, которые должны запускать официальную версию выпуска.

мой совет-правильно реализовать пользовательский обработчик ошибок и исключений через set_error_handler() и set_exception_handler(), соответственно, использовать header() для отправки клиенту надлежащей информации о состоянии http и (при необходимости) создания страниц ошибок.


видимо, есть функция под названием http_response_code это позволит вам установить код ответа соответствующим образом. Если это не работает (в документации есть примечание об этом, возможно, только в SVN), то


на PHP 5.5 = > " header ("тестер.php", true, 500); " где тестер.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. What the user sees with this, using PHP 5.4 installed with yum using CENTOS7 by default

нет перенаправления, нет взлома, безопасно, если вам не нужно выставлять ошибку, это не будет. :)


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

как вы все знаете, нет,вы не можете просто вызвать страницы ошибок Apache из PHP. Это невозможно. Таким образом, лучшее решение, которое я мог найти, после некоторых исследований, это использовать функцию PHP для отображения пользовательских страниц ошибок, который вызывается как из того, что вы указали в Apache, так и из страницы, которую вы хотите вызвать 500 внутренних ошибок сервера.

вот мой conf из Apache:

ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 500 /error.php

как вы могли видеть, все ошибки 4xx и 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() от везде, где вы хотите, покуда вы даете его правильные параметры (TRUE за 500, FALSE для 404 в моем случае).

очевидно, потому что страницы ошибок Apache генерируются одной и той же функцией ErrorPage::GenerateErrorPage(), мы можем гарантировать, что то, что вы запускаете, где именно то, что вы ожидаете от страниц ошибок Apache.

вот мой пример триггера страницы:

<?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().

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