使用IIS 7 / Tomcat连接器托管的Grails应用程序中的错误页面

时间:2013-10-23 17:19:38

标签: java tomcat iis grails

我有一个运行在IIS 7下的Tomcat 7中的Grails应用程序,使用的是Jakarta Isapi Tomcat连接器版本1.2.30,我无法通过错误处理来表现我的喜好。 Tomcat连接器在uriworkermap.properties中配置,以将应用程序URL下的所有请求转发到Tomcat:

/OrderSubmission/* = worker1

Grails应用程序有自己的自定义错误页面,当应用程序在没有IIS / Tomcat连接器的开发计算机上运行时可以正常工作,但是当在服务器上时,如果在IIS中打开自定义错误页面,这些页面总会覆盖Grails应用程序中的那些。这意味着我有一个特定的页面来处理某种异常类型,例如在UrlMappings.groovy

"500"(controller: 'error', action: 'itemNotFound', exception: ItemNotFoundException)

...我正在看到我指向IIS的静态500错误页面。

如果我在IIS中打开详细错误,我会从Grails应用程序中获取正确的错误页面 - 但是,如果请求在应用程序的上下文之外的URL,我会看到详细的IIS 404页面,是不可接受的。如果我更改Tomcat连接器的uriworkermap.properties以包含从根向下的所有内容,那么我会看到默认的Tomcat 404错误页面。我已经尝试通过将error_page中的isapi_redirect.properties选项设置为指向我的IIS静态自定义页面来将Tomcat连接器默认设置为自定义页面,如下所示:

error_page=/%d.htm

...但这不起作用,我找不到任何在任何地方使用此设置的示例。

我需要发生的是显示自定义Grails错误页面 - 除非请求的URL在应用程序之外或应用程序已关闭,此时我需要显示自定义静态错误页面。

有没有人设法实现这一目标?

TIA

1 个答案:

答案 0 :(得分:0)

我最终使我的错误页面控制器方法返回状态200(OK),除非处理AJAX请求:

class ErrorController {
    def pageNotFound() {
        if (!request.xhr){
            response.status = 200
        }
    }
}

IIS设置为“自定义错误页面”。

这可以防止IIS踩入并提供我提供的自定义静态页面,除非请求的URL超出了Grails应用程序的范围。

为AJAX请求保留错误状态,以便允许调用者正确处理结果。

我不确定从错误的应用程序返回200是否是令人满意的做法,特别是在搜索引擎方面 - 但是,即使没有这种更改,当发生错误并且响应最终返回到浏览器时也是如此根据Fiddler的说法,IIS的状态为200。