Java 使用Tomcat'的自定义错误页面;使用mod_jk和Apache httpd时的404页

Java 使用Tomcat'的自定义错误页面;使用mod_jk和Apache httpd时的404页,java,tomcat,httpd.conf,mod-jk,Java,Tomcat,Httpd.conf,Mod Jk,我们有如下设置: httpd <-> mod_jk (Tomcat) httpd模块jk(Tomcat) httpd被配置为将所有请求转发到URL/app*和mod_jk。 httpd配置了用于HTTP错误404、500等的自定义错误页 如果用户输入URL,http://hostname/non-existing-page-然后显示httpd的自定义404错误页面 如果用户输入URL,http://hostname/app-blabblah-然后,显示Tomcat的404错误页面

我们有如下设置:

httpd <-> mod_jk (Tomcat)
httpd模块jk(Tomcat) httpd被配置为将所有请求转发到URL/app*和mod_jk。 httpd配置了用于HTTP错误404、500等的自定义错误页

如果用户输入URL,
http://hostname/non-existing-page
-然后显示httpd的自定义404错误页面

如果用户输入URL,
http://hostname/app-blabblah
-然后,显示Tomcat的404错误页面。如果是类似于/app/non-existentpage的应用程序,则托管在/app的应用程序可以处理404个错误。但context/appblah不能解析为Tomcat上的任何war文件,因此会导致Tomcat的404错误页面

我们使用的是Tomcat的精简版,它的webapps文件夹只有
app.war

我被要求不要显示Tomcat 404错误页面,因为它揭示了应用程序托管在Tomcat上的事实,并显示了Tomcat的版本

如果有人能告诉我如何:

  • 当Tomcat必须处理表示不存在上下文的URL时,为其添加自定义404错误页面
  • 或者配置httpd,如果它看到Tomcat返回404错误,它就会呈现自己的自定义404错误页面
  • PS:我不能随意将/app/*指向mod_jk,因为我们有时部署以app开头的其他war用于调试目的,例如app-debug.war


    更新:我正在将mod_jk workers.properties更改为仅转发/app/*到Tomcat。回答您的问题:

  • 当Tomcat必须处理URL时,为其添加自定义404错误页面 表示不存在的上下文
  • 并尊重您最初的限制:

    我不能像我们有时说的那样,自由地将/app/*指向mod_jk 部署以应用程序开始的其他WAR以进行调试-用于 e、 g.app-debug.war

    最简单的解决方案是使用根webapp文件夹。但是,为了尊重您的其他条件,使您的webapps文件夹保持最低限度,您不必在根webapp文件夹中保留任何内容,只需保留您的自定义错误页面

    使用此配置,您只需添加$CATALINA_BASE/conf/web.xml

    <error-page>
      <error-code>404</error-code>
      <location>/general-error.html</location>
    </error-page>
    
    
    404
    /general-error.html
    
    或者任何最适合你的东西。(在这里,您可以使用与应用程序相同的错误自定义页面。war和最终用户将看不到差异)


    结果是:

    情景1:
    http://hostname/non-existing-page

    • 将显示httpd错误自定义页面
    情景2:
    http://hostname/app/non-existing-page

    • 将显示应用程序app.war的错误自定义页面。(先使用$CATALINA_BASE/conf/web.xml,然后使用$CATALINA_BASE/webapps/app/web-INF/web.xml)
    情景3:
    http://hostname/app-dummy-url

    • 将显示根文件夹的Tomcat错误自定义页面。(仅使用$CATALINA_BASE/conf/web.xml)

    在“编辑”中,删除了约束,现在可以:

    chang(e)mod_jk workers.properties仅转发/app/*到Tomcat

    在这个配置中,您将获得与您想要的备选方案相同的结果:

  • 或者配置httpd,以便在它看到Tomcat返回404时 错误,它呈现自己的自定义404错误页面

  • 但是,如果您仍然希望使用问题(app debug.war)中提到的调试war文件,则每次都需要修改httpd配置(worker.properties,可能还有VirtualHosts)和/或在这些文件中进行调试配置。由于它似乎不适合生产环境,因此在Tomcat中使用仅包含自定义页面的文件夹根目录似乎是最好的解决方案。

    请检查此链接和此链接Cheers@Devdas谢谢你的链接。正如我在文章中提到的,在“应用”上下文中任何错误的URL都会显示我们的自定义错误页面。但如果上下文名称本身是错误的,比如说“app blahblah”,那么请求将不会到达“app.war”,并且将由Tomcat处理——当Tomcat找不到任何与之匹配的上下文时,它会报告404页面——一个标准的Tomcat 404错误页面。我需要将此错误页面修改为自定义页面。您只能使用“mod_proxy”来执行此操作,只需删除mod_jk并使用带有ProxyErrorOverride指令的mod_proxy即可。是否可以添加仅显示错误的ROOT.war?谢谢您的回答。我们的产品有自定义脚本来启动Tomcat,它似乎可以在重启过程中清除Webapps目录中的所有目录。我找到了一个对ErrorReportValve的引用,它可以让我在Tomcat错误页面中隐藏服务器信息,但是我们的Tomcat版本比将标志添加到此类的版本旧。我试图修改global web.xml,它位于Tomcat的conf文件夹中,以添加ErrorPage指令-它会在浏览器上产生空白内容-我希望它可以重定向到httpd的error pages/error/http404.html。你的Tomcat版本是什么?我才意识到这件事哪儿也没提到/没人问。(还有,哪个Apache版本?)7.0.53是Tomcat版本使用自定义ErrorReportValve来显示错误页面应该与Tomcat 7一起工作。(见附件)。另一方面,当您修改$CATALIBA_BASE/conf/文件夹的web.xml时(正如我在回答中所建议的那样),它会在$CATALINA_BASE/webapps/ROOT中查找您的自定义-error-url.html页面。所以你有一张空白页,因为这里什么也找不到。如果您无法修改重新启动脚本(这会清除您的webapps文件夹,包括ROOT),那么使用自定义阀可能确实是您的解决方案。