【问题标题】:HTML 500 error page for .htaccess errors.htaccess 错误的 HTML 500 错误页面
【发布时间】:2015-10-01 02:57:59
【问题描述】:

我知道什么是 HTML 500 错误,并且我知道如何研究解决它们,

我使用 apache 2 运行服务器,并且通过 cPanel 和 WHM 进行管理控制。

我正在寻找有关如何在我的网站上出现有用且信息丰富的 HTML 500 错误页面后向最终用户反馈的一些指导。

我已阅读:PHP: 500 Error to error pagehttps://ux.stackexchange.com/questions/15955/how-to-create-a-useful-500-internal-server-error-page

但这些似乎不是我想要的,例如http://www.smashingmagazine.com/2011/05/27/getting-started-with-defensive-web-design/(引用自上述链接之一)告诉我如何为 500 错误页面设计艺术作品,但没有任何迹象表明发生错误时如何部署此页面。

我最常见的一点是我偶尔会出现 HTML 500 错误,.htaccess 文件中有错误,对于网站来说,这个网站可能只会关闭几分钟,但有大约 50k访客一个月,这个停机时间,即使是短暂的,也会被数十人看到,并且真的应该很好地呈现,很好,信息丰富,而不是当前的标准是:

内部服务器错误

服务器遇到内部错误或配置错误,无法完成您的请求。

此外,在尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。

我有一个包含 500 个错误的服务器错误页面已经在我的服务器管理员 (cPanel) 中设置、创建和加载,但错误页面示例(上图)声称无法找到它,我在.htaccess 中也有一个errorDocument 句柄,它指向同一页面。

所以我的问题是:

  • 当我遇到这些错误时,我需要设置哪些流程来部署一个连贯且信息丰富的错误 500 页面?

  • 特别是当我遇到.htaccess 错误时

我有一种感觉,由于错误(服务器)的性质,这意味着错误页面无法从发生错误的同一服务器部署,因此服务器无法异步工作?

  • 以上是否意味着 HTML 500 错误只能从多服务器情况或 CDN 中真正部署?

【问题讨论】:

  • “但错误页面示例(上图)声称无法找到它” - 这并不是说它无法找到它(404)。这是说尝试“使用它”时又发生了 500 错误。

标签: apache .htaccess error-handling server


【解决方案1】:

我有一种感觉,由于错误(服务器)的性质,这意味着错误页面无法从发生错误的同一服务器部署,因此服务器无法异步工作?

  • 以上是否意味着 HTML 500 错误只能从多服务器情况或 CDN 中真正部署?

我想说它们只能可靠从多服务器配置中部署。
数学很简单:

错误页面本身就是对服务器的请求。
如果服务器由于配置错误或代码错误而无法完成请求,则无法保证错误页面不会发生同样的情况。
但最终,这取决于您的配置。
例如,如果您在某个子文件夹中的 .htaccess 文件中出错,导致无限递归,则错误页面将正常加载,前提是它不是从该目录提供的。
但是,如果您在 所有 URL 上造成无限重定向,那么对错误文档的请求也会受到影响,这正是服务器告诉您时发生的情况:

此外,在尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。

这就像报告错误报告错误 - 根据其严重程度,这可能会也可能不会。

如果有另外一个单独配置的服务器,则不受服务器1故障的影响。
它不需要是物理服务器,只需启动第二个 Web 服务器即可

  • 一个充当另一个的代理或负载平衡器
  • 该代理配置为重定向来自其他服务器的响应,状态码为 500
  • 代理本身没有配置错误

对于 apache,使用mod_proxy_balancer,这样的配置可能看起来像

<VirtualHost *:80>
    ServerName 127.0.0.1
    DocumentRoot /var/www/errorpages/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias *.example.com
    ServerAlias example.com
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / balancer://whatever/
    ProxyPassReverse / balancer://whatever/
    <Proxy balancer://whatever/>
        ProxySet failonstatus=500
        BalancerMember http://127.0.0.1:42 retry=1
        BalancerMember http://127.0.0.1:80 status=+H
    </Proxy>
</VirtualHost>

此服务器需要在端口 80 上启动,并将所有传入请求传递到端口 42(因此其他服务器需要侦听端口 42,最好只在 127.0.0.1 上)。如果运行在端口 42 上的服务器返回的任何响应的状态码为 500,则端口 80 上的服务器会将请求重新发送到 127.0.0.1 上的端口 80,从而将请求传递给它自己,但使用不同的Host 标头,这样它就不会再次碰到负载均衡器。

【讨论】:

  • 感谢您的解释。你重申了我的怀疑,但没有足够的知识来确定。 :-/ 。由于我当前的结构在根文件夹中有.htaccess(而不是在不同的特定子文件夹中有很多),因此如果不重组我的文件夹/文件或使用第二个文件夹,我似乎无法设置一个信息丰富的error 500 页面服务器。大量工作以最小化影响。
  • “例如,如果您在某个子文件夹中的 .htaccess 文件中出错,导致无限递归,则错误页面将正常加载,前提是它不是从该目录提供的。” - 不幸的是,情况似乎并非如此。在我的测试中,如果由于 特定 URL 路径(不影响 ErrorDocument)上的重写循环而发生 500 错误,那么我仍然会收到附加消息...“另外,一个尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。”。直接请求错误文档就可以了。 (?)
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 2017-06-28
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
相关资源
最近更新 更多