自定义apache 500错误PHP页面

时间:2018-08-10 19:14:58

标签: php apache custom-error-pages

好的,我想在这里放开我的头脑...

尝试并测试过,但似乎无法加载自定义HTTP 500错误页面。 Chrome会一直为我提供默认的“此页面无法正常工作,HTTP错误500”错误页面。

我已采取的步骤:

  • 创建了500.php文件,该文件将显示我需要的自定义页面
  • 在.htaccess文件的下面一行更改
  • 在服务器上创建了一个文件,该文件将加载不存在的类,从而导致500错误。
  • Access_log显示请求和500状态

访问日志

  

:1--[10 / Aug / 2018:20:51:39 +0200]“ GET / HTTP / 1.1” 500-

错误日志

  

[2018年8月10日星期五20:51:39.156104] [php7:error] [pid 11608] [client :: 1:65263] PHP致命错误:未捕获的错误:在/ private / var /中找不到类'tests' www / development / public_html / index.php:7 \ n堆栈跟踪:\ n#0 {main} \ n在第7行的/private/var/www/development/public_html/index.php中抛出

.htaccess行

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设置吗?是因为它是本地的...

1 个答案:

答案 0 :(得分:2)

您的评论实质上是正确的。通过.htaccess能够重定向到错误文档的方式,许多500个错误不会到达apache。

有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');