java - 使用 mod_jk 和 Apache httpd 时,为 Tomcat 的 404 页面使用自定义错误页面

标签 java tomcat httpd.conf mod-jk

我们有这样的设置:

httpd <-> mod_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 的应用程序可以处理 404 错误,如果它类似于/app/non-existentpage。但是 context/app-blablah 没有解析到 Tomcat 上的任何 war 文件,因此导致 Tomcat 的 404 错误页面。

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

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

谁能告诉我怎么做:

  1. 当 Tomcat 必须处理表示不存在的上下文的 URL 时,为 Tomcat 添加自定义 404 错误页面。
  2. 或者配置 httpd,如果发现 Tomcat 返回 404 错误,它会呈现自己的自定义 404 错误页面。

PS:我不能随意将/app/* 指向 mod_jk,因为我们有时会部署以 app 开头的其他 war 以进行调试 - 例如应用调试.war。

更新:我正在更改 mod_jk workers.properties 以仅将/app/* 转发到 Tomcat。

最佳答案

回答你的问题:

  1. Add custom 404 error page for Tomcat when it has to deal with URLs that represents non-existing context.

并尊重您的初始约束:

I am not at liberty to point only /app/* to mod_jk, as we sometimes deploy other wars that start with app for debugging purposes - for e.g. app-debug.war.

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

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

<error-page>
  <error-code>404</error-code>
  <location>/general-error.html</location>
</error-page>

或者任何最适合你想要的东西。 (在这里,您可以使用与您的 app.war 相同的错误自定义页面,最终用户将看不到差异)。


结果是:

情况一:http://hostname/non-existing-page

  • 将显示 httpd 错误自定义页面

情况二:http://hostname/app/non-existing-page

  • 将显示您的应用程序 app.war 的错误自定义页面。 ($CATALINA_BASE/conf/web.xml 然后使用 $CATALINA_BASE/webapps/app/WEB-INF/web.xml)

情况三:http://hostname/app-dummy-url

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

在您的编辑中,您删除了您的约束并且现在能够:

chang(e) mod_jk workers.properties to forward only /app/* to Tomcat.

在这种配置下,您将获得与您想要的替代方案相同的结果:

  1. Or configure httpd such that if it sees that Tomcat is returning 404 error, it renders its own custom 404 error page.

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

关于java - 使用 mod_jk 和 Apache httpd 时,为 Tomcat 的 404 页面使用自定义错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44426400/

相关文章:

java - 将 java 类转换为 php 类的最佳方法是什么?

java - Android - 动态设置 Intent 附加功能

spring-mvc - 找不到 Tomcat 404 Http

python - 此 WSGI 应用程序无法访问守护进程 :/mod. wsgi

java hashCode疑惑

java - 抛出运行时异常

java - Maven 在运行 Spring Boot 应用程序时无法启动嵌入式 Tomcat 容器

java.lang.UnsupportedClassVersionError : myApp : Unsupported major. 次要版本 51.0(无法加载类 myApp)在 Linux 上

apache 无法重定向到 SSL 中的自定义错误页面

javascript - Js 和 css 文件未加载到 Symfony 3 上的虚拟主机上