2014-03-05 73 views
1

我见过数百页解释如何在Apache 2服务器中创建自定义错误页面。我的问题是不同的。我有一个在Apache中运行的Web应用程序(它是一个ISAPI DLL,但它也可能是一个CGI可执行文件)。我的应用程序可以处理内部服务器错误,并生成包含在响应中的详细错误消息(包括完整的堆栈跟踪)以及错误代码500. AFAIK,Apache只是让我使用重定向来显示自定义错误消息: http://httpd.apache.org/docs/2.2/custom-error.htmlApache自定义动态错误响应

HTTP规范(RFC 2616 - 第10部分),不仅允许而且建议详细的错误消息应被包括在响应中的错误代码的情况下BODY部> 500 链接:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5

似乎Apache不会让我的自定义错误消息转到浏览器,并且总是用它自己的内部错误消息替换它,并且我相信这不是基于RFC 2616的正确行为。

所以我的问题是:是否有任何设置在Apache服务器,让我的自定义消息去浏览器?或者,有什么可以在我的应用程序中完成,它将指示Apache发送我的自定义错误消息(类似于响应中的某个特定标题字段)?

更多关于这个问题的信息: 当我的ISAPI应用程序返回错误代码500,并在响应正文中出现其他错误信息时,Apache用它的标准“500 Internal Server Error”消息/ HTML内容替换它,并在Error.log文件我可以看到“无用”“脚本头文件的提前结束”消息。我深信我的头文件很好,包括Content-Type字段。 如果我将500错误代码替换为任何其他服务器错误代码(例如501),它可以完美地工作,并且我的响应按原样发送到浏览器。相同的头部被发送到Apache服务器,只有错误代码是不同的(501,而不是500)。考虑到这个测试结果,其中一个必须是真实的: 1-当状态码为500时,Apache需要一些特定的标题字段 2- Apache不会让状态码为500的自定义错误消息进入浏览器。 我没有看到任何其他的选择。

回答

0

我想你是混淆了两个问题。您可以使用CGI脚本生成500个响应,并包含您的自定义正文。或者你可以用任何你想要的资源覆盖任何500。

如果你没有做到前者,那很可能是因为Apache和你的模块之间的ISAPI接口有一些微妙的东西。台检查代码说,你应该能够要么设置伪

状态:500

头,或基本上返回任何ISAPI错误,并用500和自定义的身体结束。

Apache有两个状态码的概念 - 状态行(r-> status)和处理请求的模块(返回HTTP_INTERNAL_SERVER_ERROR,返回r->状态)分开返回的错误代码。

当前者用作后者时,自定义错误消息丢失。所有这些都发生在Apache中的./modules/arch/win32/mod_isapi.c中。无论发生什么事情,ISAPI都是独一无二的。

+0

您好科维纳,感谢您的回复。我不确定这个问题是否依赖于我的ISAPI模块,一旦在IIS 6,7和7.5中相同的二进制工作正常,并且我的自定义错误消息(错误代码= 500)被浏览器接收并显示给用户。另一方面,Apache只发送自己的标准500错误页面...... – Alexandre

+1

我做了另一个测试:我发送的是200代码,而其余的响应是相同的,而不是在响应头中发送500错误代码。如果我的ISAPI应用程序出现问题,Apache也应该将其报告为500错误,对吗?但它没有发生。在这种情况下,完整的响应会到达浏览器,不受影响。我只能假设Apache不允许带有错误代码500的ISAPI响应进入浏览器,并用其自己的标准错误消息替换正文内容。 – Alexandre

相关问题