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

Use custom error page for Tomcat's 404 Page when using mod_jk and Apache httpd

我们有这样的设置:

httpd <-> mod_jk (Tomcat)

httpd 配置为 ward 对 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. 在必须处理表示不存在的上下文的 URL 时,为 Tomcat 添加自定义 404 错误页面。
  2. 或者配置 httpd,如果发现 Tomcat 正在返回 404 错误,它会呈现自己的自定义 404 错误页面。

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

更新:我正在将 mod_jk workers.properties 更改为 forward only /app/* to 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 相同的错误自定义页面,最终用户不会看到差异)。


结果是:

情况 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

  • 将显示您的 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)每次 and/or 让这些文件中的调试配置。由于它似乎不适合生产环境,因此在 Tomcat 中使用仅包含自定义页面的文件夹 ROOT 似乎是 IMO 的最佳解决方案。

如果您已将 tomcat 与 apache 集成并为其使用 mod_jk,请使用以下步骤创建 404 和 401 自定义错误页面。

所有步骤都在下面提到 link。

https://devopstech2020.blogspot.com/2021/07/use-custom-error-page-for-tomcats-404.html