使用 PHP 7 显示自定义错误页面 - 对我来说是详细信息,对用户来说是通用的

Posted

技术标签:

【中文标题】使用 PHP 7 显示自定义错误页面 - 对我来说是详细信息,对用户来说是通用的【英文标题】:Display custom error pages with PHP 7 - details for me, generic for users 【发布时间】:2017-08-25 21:21:45 【问题描述】:

使用 Linux/Apache/php7,我想优雅地显示所有错误消息。我的 .htaccess 文件包含以下内容:

ErrorDocument 400 /errors/error.php
ErrorDocument 401 /errors/error.php
ErrorDocument 403 /errors/error.php
ErrorDocument 404 /errors/error.php
ErrorDocument 500 /errors/error.php
ErrorDocument 502 /errors/error.php
ErrorDocument 504 /errors/error.php

...指向 error.php 页面,其中包含以下内容:

$status = $_SERVER['REDIRECT_STATUS'];
$codes = array(
400 => array('400 Bad Request', 'The request cannot be fulfilled due to bad syntax.'),
403 => array('403 Forbidden', 'The server has refused to fulfil your request.'),
404 => array('404 Not Found', 'The page you requested was not found on this server.'),
405 => array('405 Method Not Allowed', 'The method specified in the request is not allowed for the specified resource.'),
408 => array('408 Request Timeout', 'Your browser failed to send a request in the time allowed by the server.'),
500 => array('500 Internal Server Error', 'The request was unsuccessful due to an unexpected condition encountered by the server.'),
502 => array('502 Bad Gateway', 'The server received an invalid response while trying to carry out the request.'),
504 => array('504 Gateway Timeout', 'The upstream server failed to send a request in the time allowed by the server.'),
);
$title = $codes[$status][0];
$message = $codes[$status][1];
if ($title == false || strlen($status) != 3) 
$message = 'Please supply a valid HTTP status code.';

echo '<h1>Hold up! '.$title.' detected</h1>
<p>'.$message.'</p>';

404 函数似乎工作得很好,但任何 php 错误(如函数名称中的拼写错误)仍会显示为带有标准 php 错误消息的白屏。即使是 .htaccess 文件中的故意拼写错误也会产生一般的 500 错误,但不会使用我为此目的建立的 error.php 页面。

我还想做的是为我显示 php 错误详细信息,但为用户隐藏详细信息,即使在生产模式下也是如此。

【问题讨论】:

这听起来可能很糟糕,但是“嗯,嗯”——你已经告诉它如何处理 HTTP 错误(其中 404 是最容易测试的),但你没有告诉它做PHP错误的事情。查看set_exception_handlerset_error_handler(PHP7 之前)以及register_shutdown_function 以查看那里是否发生错误。话虽如此,如果您的错误处理程序中有错误,那么所有的赌注都将失败,您无疑会以暴露的 PHP 错误告终。 .htaccess 中的错误会使.htaccess无效,因此不会被处理。 【参考方案1】:

有点晚了,但我会添加它以帮助未来的读者。 Apache 不会捕获 PHP 语法中的错误。根据this thread on the webmasters forum,有一些关于语法错误是否为“真”500 错误的讨论。我所有的浏览器都将其显示为 500 代码。但是ErrorDocument 500 /err500.php 是-就像您的情况一样-不是由它触发的;但是,它会记录在您在 Apache 中定义的错误日志中。它记录但不触发ErrorDocument 命令的事实让我花了一段时间才弄清楚。我仍在寻找一种不需要我修改页面上所有 PHP 页面的解决方法。

【讨论】:

以上是关于使用 PHP 7 显示自定义错误页面 - 对我来说是详细信息,对用户来说是通用的的主要内容,如果未能解决你的问题,请参考以下文章

page.tpl.php中的Drupal 7自定义徽标未显示在所有页面上

通过自定义错误页面处理 PHP / mysql 错误(包括致命错误)

PHP中的自定义404错误页面

Vue 无法识别我的组件,即使它对我来说似乎很好。错误 - 未知的自定义元素:<componentName>

自定义帖子类型和页面层次结构 - 错误 404

自定义archive.php页面中的分页