好的,我想在这里放开我的头脑...
尝试并测试过,但似乎无法加载自定义HTTP 500错误页面。 Chrome会一直为我提供默认的“此页面无法正常工作,HTTP错误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设置吗?是因为它是本地的...
答案 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');