web.xml 中 welcome-file-list 不生效的根本原因是容器未加载 web.xml 或欢迎文件路径/存在性不满足要求:Tomcat 9+、Jetty 10+ 及 Spring Boot 内嵌容器默认忽略 web.xml;欢迎文件必须位于 WebRoot 根目录且严格匹配大小写,容器仅按顺序检查物理存在性,不校验响应状态或执行 Filter;Spring Boot 应通过 WebMvcConfigurer 或 static-locations 配置首页,而非依赖 web.xml。

web.xml 里 welcome-file-list 不生效?先看容器是否加载了 web.xml
Tomcat 9+、Jetty 10+ 或 Spring Boot 内嵌容器默认不扫描 web.xml,哪怕文件存在,welcome-file-list 也完全被忽略。这不是配置写错了,是根本没读。
- Spring Boot 项目:除非显式启用传统部署(如继承
SpringServletContainerInitializer),否则web.xml被直接跳过 - 纯 WAR 部署到 Tomcat:确认
WEB-INF/web.xml路径正确,且文件根元素是<web-app>,不是<configuration>等错误命名空间 - IDE 运行时:Eclipse/IntelliJ 可能缓存旧部署描述符,删掉
target/或out/目录再 clean rebuild
欢迎文件顺序和路径匹配规则很严格
welcome-file-list 不是“优先级列表”,而是按顺序逐个尝试访问,只要某个文件物理存在且可被 Servlet 容器映射到,就停止查找。它不支持通配符、不解析重定向、也不走 Filter 链。
- 常见错误:
<welcome-file>index.html</welcome-file>写对了,但实际文件叫Index.html(大小写敏感)或放在static/子目录下(必须在 WebRoot 根目录) - 路径只认静态资源或已注册的 Servlet 映射:比如
index.jsp存在但没配 JSP Servlet(Tomcat 9 默认禁用),就会跳过,继续试下一个 - 若列了
index.jsp和index.html,而index.jsp存在但返回 500,容器不会 fallback 到index.html—— 它只检查文件是否存在,不检查响应状态
Spring Boot 用户别硬套 web.xml,改 WebMvcConfigurer
Spring Boot 的默认首页逻辑走的是 ResourceHttpRequestHandler,跟 welcome-file-list 没关系。强行放 web.xml 不仅无效,还可能干扰自动配置。
- 正确做法:实现
WebMvcConfigurer,重写addViewControllers,用registry.addViewController("/").setViewName("forward:/index.html"); - 或者更轻量:在
application.properties加spring.web.resources.static-locations=classpath:/static/,classpath:/public/,确保index.html在这些路径下 - 注意:Spring Boot 2.6+ 默认禁用
/路径的自动欢迎页,需显式配置spring.webflux.hiddenmethod.filter.enabled=true并不相关 —— 别被过时博客带偏
WAR 包部署后仍 404?检查实际发布结构
IDE 打包或 Maven 构建时容易把 index.html 放错位置。容器只从 WebRoot(即解压后 WAR 的根)找 welcome 文件,不是从源码目录结构推断。
- 打开生成的 WAR 包,确认
index.html真的在顶层,不是藏在src/main/webapp/index.html却没被 Maven-war-plugin 复制过去 - Maven 项目中,
webappDirectory默认是src/main/webapp,但如果你用了resources插件覆盖了 copy 行为,index.html可能被漏掉 - Tomcat 日志里搜
Deploying web application,看它实际解压出的路径里有没有你写的那个文件名 —— 别靠 IDE 的 Project View 猜










