当我启动我正在构建的网站到我的生产服务器时,我希望生产服务器在用户试图加载包含.html错误的页面时显示一个自定义的PHP页面。
在我的家庭内部开发服务器上,我目前将php.ini错误值设置为生产值,所以当我加载一个页面时,浏览器只显示一个“500Server错误”页面。我尝试使用一个带有.htaccess文件的ErrorDocument 500 /500.html文件来拦截这个错误。但是它不起作用;浏览器仍然给我显示了默认的500页。
在Google-fu之后,我被引导相信PHP语法错误不会触发真正的500错误,这就是为什么我的自定义页面不会加载。
当浏览器试图加载包含Is语法错误的页面时,有一种方法可以加载自定义错误页?
我可以随心所欲地在家里的服务器上做我想做的事情,但是我支付了在生产服务器上托管的费用,所以我只限于使用PHP代码和.htaccess文件。我想在家里安装我的服务器,所以当我迁移到这个站点时,它使用的规则和生产服务器差不多。当加载坏页面时,他们的服务器将所有PHP错误记录到error_log文件中。我只想让最终用户看到一些更有用的东西,如果迁移过程中存在迁移问题,但是没有看到关于语法错误本身的任何细节。
发布于 2018-06-04 00:46:59
PHP语法错误不会触发真正的500错误。
不,这肯定是一个“真正的500错误”,只是它是由PHP而不是Apache触发的,这就是Apache没有被触发的原因。(同样的方式,如果您的PHP脚本返回一个404未找到的响应,Apache不会介入并使用定义的404 ErrorDocument进行响应。)
PHP在以下场景中使用500内部服务器错误进行响应:
display_errors是"Off“。display_errors是"On“,那么就会得到输出。)500响应实际上是让客户端知道发生了错误的最后一次尝试。如果在发生致命错误之前有任何输出,那么您将得到一个常规的200 OK响应。
PHP语法错误(即。(致命的E_PARSE错误)不能使用正常的错误处理程序来捕获。(大概您已经注册了一个自定义错误处理程序?)但是,您可以在PHP中注册一个关闭函数,这个函数总是在脚本的末尾被调用,即使在发生致命的PHP错误之后也是如此。在这个关机函数中,您可以检查最后一个错误并“做一些事情”,例如。做出友好的回应。这种方法有两个先决条件:
因此,例如,您可以这样做:
在mypage.php中:
在fatal-parse-error.inc.php中,有一个语法错误:
我只想让最终用户看到一些更有用的东西,如果迁移过程中存在迁移问题,但是没有看到关于语法错误本身的任何细节。
但是,您的意思是"PHP语法错误“吗?而不是可捕获的运行时错误,比如数据库连接问题等等?您确实不应该在生产环境中获得E_PARSE错误,或者至少这是一个极端的边缘情况。
如果“迁移”是一个大的‘运行,那么也许您应该限制访问,并提供一个临时的"503服务不可用“的所有用户,但选定的少数?
参考资料:
http://php.net/manual/en/errorfunc.constants.phphttp://php.net/manual/en/function.error-get-last.phphttp://php.net/manual/en/function.register-shutdown-function.phphttps://stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-errorhttps://insomanic.me.uk/php-trick-catching-fatal-errors-e-error-with-a-custom-error-handler-cea2262697a2https://webmasters.stackexchange.com/questions/115575
复制相似问题