Spring Boot中如何禁用嵌入式Tomcat的无尾斜杠请求重定向?
解决Spring Boot嵌入式Tomcat禁用尾斜杠重定向问题
我之前也碰到过一模一样的需求——就是不想让不带尾斜杠的请求被自动重定向到带尾斜杠的地址,宁愿返回404也不要302跳转。嵌入式Tomcat的配置确实和独立部署的Tomcat有点区别,不过有两种简单可行的方法可以实现:
方法一:使用Spring Boot配置属性(推荐,适用于Spring Boot 2.2+)
Spring Boot从2.2版本开始,已经把Tomcat的mapperContextRootRedirectEnabled参数封装成了原生配置属性,直接在配置文件里设置就行:
application.properties
# 禁用上下文根的尾斜杠重定向 server.tomcat.mapper-context-root-redirect-enabled=false
application.yml
server: tomcat: mapper-context-root-redirect-enabled: false # 禁用上下文根的尾斜杠重定向
这个配置直接对应Tomcat原生的mapperContextRootRedirectEnabled参数,设置为false后,访问不带尾斜杠的上下文根(比如http://server/context-name)就会返回404,而不是302重定向到带尾斜杠的地址。
方法二:自定义Tomcat上下文配置(适用于所有Spring Boot版本)
如果你用的是Spring Boot 2.2之前的版本,或者需要更灵活的定制,可以通过自定义TomcatServletWebServerFactory来修改Tomcat的上下文设置:
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatCustomConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatContextCustomizer() { return factory -> { factory.addContextCustomizers(context -> { // 禁用上下文根的尾斜杠重定向 context.setMapperContextRootRedirectEnabled(false); // 可选:如果想禁用所有路径的尾斜杠重定向(比如/foo -> /foo/),可以添加下面这行 // context.setMapperRedirectEnabled(false); }); }; } }
这里通过WebServerFactoryCustomizer来定制Tomcat的上下文,setMapperContextRootRedirectEnabled(false)专门关闭上下文根的重定向逻辑;如果需要禁用所有路径的尾斜杠重定向,就把setMapperRedirectEnabled(false)也加上。
设置完成后重启应用测试,原来的302重定向就会变成404响应,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Gert-Jan
相关产品推荐
相关产品推荐

