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

标签 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 页面,它是 Not Acceptable 。如果我更改 Tomcat 连接器的 uriworkermap.properties 以包括从根向下的所有内容,那么我会看到默认的 Tomcat 404 错误页面。我已经尝试通过将 isapi_redirect.properties 中的 error_page 选项设置为指向我的 IIS 静态自定义页面,让 Tomcat 连接器默认为自定义页面:

error_page=/%d.htm

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

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

有没有人设法做到这一点?

TIA

最佳答案

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

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

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

这会阻止 IIS 介入并提供我提供的自定义静态页面,除非请求的 URL 在 Grails 应用程序的范围之外。

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

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

关于java - 使用 IIS 7/Tomcat 连接器托管的 Grails 应用程序中的错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19548239/

相关文章:

tomcat - Liferay 在安装新的 portlet 时给出 "ERROR [PortletRequestProcessor:377] Forward does not exist"

iis - IIS 部署站点上的 Ingres 连接

java - Jackson - 将 JSON 反序列化为类

java - 无法解决 Android 错误 :Execution failed for task ':app:compileDebugJavaWithJavac'

java - 当我单击“打印”对话框的属性按钮以及打印后,WPrinterJob.validatePaper() 正在更改页面的原始 imageableArea

java - quartz ,调度过程始终存在

java - Apache Tomcat :Path Error

c# - 使用 net.msmq 绑定(bind)在 IIS 中托管的 WCF 服务会产生问题

iis - 如何在 XP 和 C# 上使用 IIS5.1 调试客户端证书

java - 将 Vaadin7 StreamResource 保存到文件