.htaccess 错误的 HTML 500 错误页面

Posted

技术标签:

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

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

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

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

我已阅读:php: 500 Error to error page 和https://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 错误。 【参考方案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 错误。”。直接请求错误文档就可以了。 (?)

以上是关于.htaccess 错误的 HTML 500 错误页面的主要内容,如果未能解决你的问题,请参考以下文章

使用 .htaccess 压缩文件时出现 500 错误

错误 500:.htaccess RewriteCond:错误的标志分隔符

htaccess - XAMPP上的互联网服务器错误500 [关闭]

.htaccess 500 wamp 中的内部服务器错误

.htaccess 错误内部服务器 500

.htaccess(500 内部服务器错误) - 删除 url 中的文件扩展名