我已经看过数百个页面,解释了如何在Apache 2服务器中创建自定义错误页面。我的问题不同。我有一个在Apache中运行的Web应用程序(它是一个ISAPI DLL,但它也可以是一个CGI可执行文件)。我的应用程序可以处理内部服务器错误并生成详细的错误消息(例如,包括完整的堆栈跟踪),包含在响应中以及错误代码500.AFAIK,Apache只是让我使用重定向来显示自定义错误消息: http://httpd.apache.org/docs/2.2/custom-error.html
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字段。 如果我用任何其他服务器错误代码(例如501)替换500错误代码,它可以完美地工作,我的响应按原样进入浏览器。将相同的标头发送到Apache服务器,只有错误代码不同(501,而不是500)。考虑到这个测试结果,这两个中的一个必须是真的: 1-当状态代码为500时,Apache需要一些特定的头字段 2- Apache不允许将状态码为500的自定义错误消息发送到浏览器。 我没有看到任何其他选择。
答案 0 :(得分: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独一无二的。