我们有这样的设置:
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 的版本。
谁能告诉我怎么做:
- 当 Tomcat 必须处理表示不存在的上下文的 URL 时,为 Tomcat 添加自定义 404 错误页面。
- 或者配置 httpd,如果发现 Tomcat 返回 404 错误,它会呈现自己的自定义 404 错误页面。
PS:我不能随意将/app/* 指向 mod_jk,因为我们有时会部署以 app 开头的其他 war 以进行调试 - 例如应用调试.war。
更新:我正在更改 mod_jk workers.properties 以仅将/app/* 转发到 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 相同的错误自定义页面,最终用户将看不到差异)。
结果是:
情况一: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.
在这种配置下,您将获得与您想要的替代方案相同的结果:
- 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/