Tomcat从8.5.24升级至9.0.27后含连续双斜杠URL报404求助
解决Tomcat 9.0.27升级后含连续双斜杠URL返回404的问题
我之前升级Tomcat版本时也碰到过几乎一模一样的问题,咱们来梳理下原因和解决办法:
核心原因
Tomcat 9.x版本默认启用了URI规范化机制,会自动将URL中的连续多斜杠(比如//)合并为单个斜杠(/)。而你在Tomcat 8.5.24时的应用是依赖原始含双斜杠的URL路径进行路由匹配的,所以规范化后就找不到对应的资源,返回404。这个调整属于底层请求处理逻辑的默认行为变更,可能没有单独在版本发布说明中高亮标注。
解决方案
方案1:全局禁用URI规范化(推荐)
修改Tomcat安装目录下conf/server.xml中的<Connector>节点,添加normalizeUri="false"属性,关闭自动合并斜杠的功能:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" normalizeUri="false" />
添加完成后重启Tomcat,再测试你的双斜杠URL应该就能正常访问了。
方案2:局部处理(针对单个应用)
如果不想修改全局Tomcat配置,也可以给你的应用添加一个自定义Filter,手动保留原始请求URI中的双斜杠:
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.IOException; public class PreserveDoubleSlashFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String originalUri = req.getRequestURI(); // 包装请求,返回原始未规范化的URI HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(req) { @Override public String getRequestURI() { return originalUri; } }; chain.doFilter(wrapper, response); } @Override public void destroy() {} }
然后在应用的web.xml中注册这个Filter:
<filter> <filter-name>PreserveDoubleSlashFilter</filter-name> <filter-class>com.yourpackage.PreserveDoubleSlashFilter</filter-class> </filter> <filter-mapping> <filter-name>PreserveDoubleSlashFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
注意事项
- 测试时一定要清空浏览器缓存或者使用无痕模式,避免旧的缓存请求干扰结果
- 如果你的应用使用了框架路由(比如Spring MVC),还要确认框架本身是否有额外的URL规范化逻辑,可能需要同步调整框架配置
内容的提问来源于stack exchange,提问作者aatish bansal
相关产品推荐
相关产品推荐

