Tomcat 9.0.37:如何将通用错误页面放置在ROOT目录外?
解决Tomcat全局共享自定义错误页的问题
你的配置错误点
全局
conf/web.xml的<error-page>路径问题:
这里的<location>是相对于每个Web应用的上下文根,你把errors文件夹放在Tomcat根目录(与conf同级)时,每个应用都无法访问到这个路径,只有当errors在某个应用(比如ROOT)下时,/errors/...才会被该应用的Servlet容器解析。ErrorReportValve的相对路径问题:
Valve配置中的相对路径是相对于Tomcat的Host的appBase(默认是webapps目录),你写的errors/error_404.html会被解析为webapps/errors/error_404.html,而不是Tomcat根目录下的errors,这就是为什么放在ROOT下才有效(/errors/...会映射到ROOT应用下的errors)。
两种正确实现方案
方案一:用ErrorReportValve配置绝对路径(直接使用Tomcat根的errors文件夹)
修改conf/server.xml中的Valve配置,使用绝对文件路径(注意系统差异):
- Linux/macOS环境:
<Valve className="org.apache.catalina.valves.ErrorReportValve" error.400="file:///opt/tomcat/errors/error_400.html" error.404="file:///opt/tomcat/errors/error_404.html" showReport="false" showServerInfo="false" />
- Windows环境:
<Valve className="org.apache.catalina.valves.ErrorReportValve" error.400="file:///C:/tomcat/errors/error_400.html" error.404="file:///C:/tomcat/errors/error_404.html" showReport="false" showServerInfo="false" />
这种方式无需修改conf/web.xml,Valve会直接返回指定的静态错误页,对所有部署的应用生效。
方案二:配置全局共享上下文(让所有应用可访问errors文件夹)
- 在
conf/Catalina/localhost目录下创建errors.xml文件,内容如下:- Linux/macOS:
<Context docBase="/opt/tomcat/errors" path="/errors" reloadable="false" />- Windows:
<Context docBase="C:/tomcat/errors" path="/errors" reloadable="false" /> - 保留
conf/web.xml中的<error-page>配置:
<error-page> <error-code>404</error-code> <location>/errors/error_404.html</location> </error-page>
此配置会将/errors路径全局映射到Tomcat根目录的errors文件夹,所有应用的错误页请求都会指向这个共享资源。可以删除server.xml中的ErrorReportValve配置(若同时存在,Valve的优先级更高)。
注意事项
- 确保
errors文件夹及其下的HTML文件拥有Tomcat进程的读取权限。 - 修改配置后必须重启Tomcat才能生效。
- 方案二中的
path="/errors"不能与现有应用的上下文路径冲突。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

