настраиваемая страница ошибки apache 500

Хорошо, думаю, что я собираюсь сойти с ума здесь …

Я пытался и тестировал, но не могу загрузить пользовательскую страницу ошибки HTTP 500. Chrome продолжает показывать мне страницу с ошибкой по умолчанию «Эта страница не работает, ошибка HTTP 500».

Шаги, которые я предпринял:

  • Создан файл 500.php, который будет показывать нужную мне страницу
  • Изменен файл .htaccess со строками ниже
  • На сервере создан файл, который будет загружать несуществующий класс, что приведет к ошибке 500.
  • Access_log показывает запрос и статус 500

Accesslog

: 1 — — [10 / Aug / 2018: 20: 51: 39 +0200] «GET / HTTP / 1.1» 500 —

Журнал ошибок

[Пт, 10 августа 20: 51: 39.156104 2018] [php7: error] [pid 11608] [client :: 1: 65263] Неустранимая ошибка PHP: ошибка Uncaught: «тесты» класса не найдены в / private / var / www / development /public_html/index.php:7\nStack trace: \ n # 0 {main} \ n добавлено в /private/var/www/development/public_html/index.php в строке 7

.линии доступа

ErrorDocument 400 /404.php
ErrorDocument 403 /403.php
ErrorDocument 404 /404.php
ErrorDocument 405 /405.php
ErrorDocument 408 /408.php
ErrorDocument 500 /500.php
ErrorDocument 502 /502.php
ErrorDocument 504 /504.php

Apache 2.4+
PHP 7+

Я не вижу здесь проблемы, тем более что версия 404 выше работает без нареканий. 500.php содержит только эхо ‘500’;

Я пропускаю некоторые настройки Apache здесь? потому что это местное …

0

Решение

Ваш комментарий по сути правильный. Многие 500 ошибок не достигнут Apache таким образом, что .htaccess сможет перенаправить на документ об ошибке.

Есть 2 способа, которыми вы можете создать пользовательские шаблоны для ошибок 5xx. Какой из них вы используете, будет зависеть от того, какая именно ошибка. Если ошибкаCatchable«Вам просто нужно обернуть свою функцию в try/catch блок. Что-то вроде этого:

try{
someUndefinedFunction();
} catch (Throwable $exception) { //Use Throwable to catch both errors and exceptions
header('HTTP/1.1 500 Internal Server Error'); //Tell the browser this is a 500 error
echo $e->getMessage();
}

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

Если ошибка 500 вызвана чем-то, что не перехватывается, вам нужно зарегистрировать пользовательскую функцию выключения. Это менее распространено в php7 +, но все же может быть необходимо в зависимости от того, что вы делаете. Способ, которым это сделано, будет включать что-то вроде этого:

function handle_fatal_error() {
$error = error_get_last();
if (is_array($error)) {
$errorCode = $error['type'] ?? 0;
$errorMsg = $error['message'] ?? '';
$file = $error['file'] ?? '';
$line = $error['line'] ?? null;

if ($errorCode > 0) {
handle_error($errorCode, $errorMessage, $file, $line);
}
}
}
function handle_error($code, $msg, $file, $line) {
echo $code . ': '. $msg . 'in ' . $file . 'on line ' . $line;
}
set_error_handler("handle_error");
register_shutdown_function('handle_fatal_error');
1

Другие решения

Других решений пока нет …