我有一个运行在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
答案 0 :(得分:0)
我最终使我的错误页面控制器方法返回状态200(OK),除非处理AJAX请求:
class ErrorController {
def pageNotFound() {
if (!request.xhr){
response.status = 200
}
}
}
IIS设置为“自定义错误页面”。
这可以防止IIS踩入并提供我提供的自定义静态页面,除非请求的URL超出了Grails应用程序的范围。
为AJAX请求保留错误状态,以便允许调用者正确处理结果。
我不确定从错误的应用程序返回200是否是令人满意的做法,特别是在搜索引擎方面 - 但是,即使没有这种更改,当发生错误并且响应最终返回到浏览器时也是如此根据Fiddler的说法,IIS的状态为200。