首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PHP语法错误上加载自定义错误页

问如何在PHP语法错误上加载自定义错误页
EN

Webmasters Stack Exchange用户
提问于 2018-06-02 22:32:18
回答 1查看 3.3K关注 0票数 1

当我启动我正在构建的网站到我的生产服务器时,我希望生产服务器在用户试图加载包含.html错误的页面时显示一个自定义的PHP页面。

在我的家庭内部开发服务器上,我目前将php.ini错误值设置为生产值,所以当我加载一个页面时,浏览器只显示一个“500Server错误”页面。我尝试使用一个带有.htaccess文件的ErrorDocument 500 /500.html文件来拦截这个错误。但是它不起作用;浏览器仍然给我显示了默认的500页。

在Google-fu之后,我被引导相信PHP语法错误不会触发真正的500错误,这就是为什么我的自定义页面不会加载。

当浏览器试图加载包含Is语法错误的页面时,有一种方法可以加载自定义错误页?

我可以随心所欲地在家里的服务器上做我想做的事情,但是我支付了在生产服务器上托管的费用,所以我只限于使用PHP代码和.htaccess文件。我想在家里安装我的服务器,所以当我迁移到这个站点时,它使用的规则和生产服务器差不多。当加载坏页面时,他们的服务器将所有PHP错误记录到error_log文件中。我只想让最终用户看到一些更有用的东西,如果迁移过程中存在迁移问题,但是没有看到关于语法错误本身的任何细节。

EN

回答 1

Webmasters Stack Exchange用户

回答已采纳

发布于 2018-06-04 00:46:59

PHP语法错误不会触发真正的500错误。

不,这肯定是一个“真正的500错误”,只是它是由PHP而不是Apache触发的,这就是Apache没有被触发的原因。(同样的方式,如果您的PHP脚本返回一个404未找到的响应,Apache不会介入并使用定义的404 ErrorDocument进行响应。)

PHP在以下场景中使用500内部服务器错误进行响应:

  • 发生了致命的PHP错误。
  • display_errors是"Off“。
  • 没有启动输出(否则响应体为空)。(如果display_errors是"On“,那么就会得到输出。)

500响应实际上是让客户端知道发生了错误的最后一次尝试。如果在发生致命错误之前有任何输出,那么您将得到一个常规的200 OK响应。

PHP语法错误(即。(致命的E_PARSE错误)不能使用正常的错误处理程序来捕获。(大概您已经注册了一个自定义错误处理程序?)但是,您可以在PHP中注册一个关闭函数,这个函数总是在脚本的末尾被调用,即使在发生致命的PHP错误之后也是如此。在这个关机函数中,您可以检查最后一个错误并“做一些事情”,例如。做出友好的回应。这种方法有两个先决条件:

  • 必须在发现错误之前注册关机函数。
  • 关闭函数不能与错误在同一个文件中定义/注册。

因此,例如,您可以这样做:

在mypage.php中:

代码语言:javascript
复制

在fatal-parse-error.inc.php中,有一个语法错误:

代码语言:javascript
复制

我只想让最终用户看到一些更有用的东西,如果迁移过程中存在迁移问题,但是没有看到关于语法错误本身的任何细节。

但是,您的意思是"PHP语法错误“吗?而不是可捕获的运行时错误,比如数据库连接问题等等?您确实不应该在生产环境中获得E_PARSE错误,或者至少这是一个极端的边缘情况。

如果“迁移”是一个大的‘运行,那么也许您应该限制访问,并提供一个临时的"503服务不可用“的所有用户,但选定的少数?

参考资料:

票数 1
EN
页面原文内容由Webmasters Stack Exchange提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://webmasters.stackexchange.com/questions/115575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档