tomcat启动成功但是访问方面都是404
Tomcat启动成功了,启动页面却清一色404,成功这事儿我遇到过不下十次。但访每次排查完都觉得自己像个傻子——因为九成问题,问方出在部署路径上。面都
你访问的启动是http://localhost:8080/myapp/index.jsp,但Tomcat的成功webapps目录下,文件夹名字可能叫myapp2,但访或者压根没解压war包。问方Tomcat启动时确实会把war包自动解压,面都但如果你手动复制了一个带版本号的启动war,比如myapp-1.0.war,成功那访问路径就得带全版本号。但访这事儿我同事上周刚踩过——他把新war丢进去,问方旧文件夹没删,面都Tomcat解压后生成了myapp-1.0目录,他还在访问myapp,自然全是404。
还有一种隐蔽情况,项目里配置了context path。打开conf/server.xml,看<Context>标签的path属性。有人图省事,直接写path="/",那访问根路径就行。但如果是path="/demo",你访问localhost:8080/,Tomcat会返回默认页面,而访问localhost:8080/demo/anything,404照样出现——因为路径没对上。
再往下挖,静态资源404和动态请求404得分开看。静态资源404,检查web.xml里的<servlet-mapping>,看是不是把default servlet给覆盖了。有人为了处理REST请求,把/*映射到一个自定义servlet,结果所有对CSS、JS、图片的请求全被拦了,返回404。我见过一个项目,前端页面样式全丢了,查了半天发现是过滤器拦截了所有请求,没放行静态资源。
动态请求404,问题多半在Spring MVC或Struts的配置里。Spring MVC的DispatcherServlet如果映射的是/,那控制器里没写对的@RequestMapping,直接404。更烦人的是,你明明写了@RequestMapping("/user"),但类上又加了个@RequestMapping("/api"),访问路径就变成了/api/user,少写一层就404。这种事,光看代码发现不了,得看控制台日志——但Tomcat的日志默认只记录严重错误,404这种“正常”错误不打印,你得手动把日志级别调到DEBUG才能看到请求匹配到了哪个Handler。
最后说个冷门的。Tomcat的docBase如果指向了外部目录,而那个目录权限不对,也会出现“文件存在但404”的诡异现象。我之前部署一个项目,把静态资源放在Linux服务器的/opt/data下,Tomcat以tomcat用户运行,那个目录权限是root:root 700,结果Tomcat读不到文件,返回404。用ls -l一看就明白了,但当时愣是排查了两个小时。
所以,遇到Tomcat启动成功但全404,先别慌,按这个顺序查:第一,webapps目录下到底有什么,war包是否解压成功;第二,访问路径和项目名、context path是否完全一致;第三,看web.xml和Spring配置里的映射路径;第四,查文件系统权限。这四步走完,八成能找到问题。剩下两成,可能是Tomcat版本和项目依赖冲突,那种情况启动时通常会报错,不会是单纯404。
(责任编辑:热点)














