使用 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 的版本。
如果有人能告诉我怎么做:
- 在必须处理表示不存在的上下文的 URL 时,为 Tomcat 添加自定义 404 错误页面。
- 或者配置 httpd,如果发现 Tomcat 正在返回 404 错误,它会呈现自己的自定义 404 错误页面。
PS:我不能随意将 /app/* 指向 mod_jk,因为我们有时会部署其他以 app 开头的 war用于调试目的 - 例如应用-debug.war。
更新:我正在将 mod_jk workers.properties 更改为 forward only /app/* to Tomcat.
回答你的问题:
- 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.
好吧,在此配置中,您将获得与您想要的替代方案相同的结果:
- 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
我们有这样的设置:
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 的版本。
如果有人能告诉我怎么做:
- 在必须处理表示不存在的上下文的 URL 时,为 Tomcat 添加自定义 404 错误页面。
- 或者配置 httpd,如果发现 Tomcat 正在返回 404 错误,它会呈现自己的自定义 404 错误页面。
PS:我不能随意将 /app/* 指向 mod_jk,因为我们有时会部署其他以 app 开头的 war用于调试目的 - 例如应用-debug.war。
更新:我正在将 mod_jk workers.properties 更改为 forward only /app/* to Tomcat.
回答你的问题:
- 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.
好吧,在此配置中,您将获得与您想要的替代方案相同的结果:
- 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