我可以自定义 IIS 6 错误信息吗?
问:
在我们的 IIS 6 服务器上,偶尔我们必须关闭生产应用程序池以进行维护。在此期间,IIS 6 仅向客户端发送最基本的消息(如下所示):
Http 错误日志显示以下内容:
2004-08-26 17:06:33 127.0.0.1 1035 127.0.0.1 80 HTTP/1.1 GET / 503 1 Disabled
从此处,我们可以看到将该错误被记录为 503.1,但用户并没有得到此信息或任何其他信息。我们希望能够自定义此错误信息,以便展示我们公司的徽标并向客户提供有关站点何时恢复的其他信息。应该怎么做?
答:
IIS 6 体系结构引入了可在内核模式下运行的 http.sys 组件。可以对很多 IIS 6 错误进行自定义,但不能修改 http.sys 传递的那些错误。这其中有两个原因。
第一,不能在内核模式下运行任何用户代码是至关重要的。很多自定义的错误页实际上是脚本或程序,它们对错误进行处理以便根据我们组织的需要采取特定的操作。如果允许这些程序在内核模式下运行并且代码有错误,则它们可能会产生严重的安全或性能问题。
第二,如果您不在内核模式下运行代码,则必须跳到用户模式下执行代码;而由于应用程序池不可用,那么应该使用哪个池呢?您需要做很多假设。
抛开这些复杂问题不说,我不否认能够向至少一个自定义静态页发送这些请求是非常有用的。
在该功能出现之前(我不知道是否会出现),您还有其他的选择。一种选择是设置第二台服务器,它是 NLB 群集中使用的第一台服务器的克隆。这种布局的一个主要好处是,可以将整个服务器脱机而不会造成服务中断。
或者,在同一服务器上创建一模一样的网站,但使用不同的应用程序池。将生产站点关闭并打开备用站点。这通常比想象的要容易一些。
最后,您可以建立一个简单的站点,用于传送符合您要求的“站点正在维护中”消息。建立此站点以响应在生产站点上使用的相同“IP+端口号+主机标题”配置,并将其配置为运行特有的应用程序池。关闭生产站点并打开“辅助”站点。在维护完成后,您可以关闭辅助站点,并启用生产站点。
其中的任何选择都允许您控制在将站点脱机进行维护时所执行的操作。