0

我有一个在 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

4

1 回答 1

0

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

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

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

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

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

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

于 2013-11-20T14:49:46.673 回答