Spring Webflux 将所有 404 页面重定向到 index.html
Posted
技术标签:
【中文标题】Spring Webflux 将所有 404 页面重定向到 index.html【英文标题】:Spring Webflux redirect all 404 pages to index.html 【发布时间】:2020-09-30 22:03:20 【问题描述】:我无法找到以下问题的答案: 如何将所有未处理(无控制器)的 url 重定向到 index.html ? 我找到了以下指南 webflux redirect root path to index
但这无助于重定向其他未映射的 url,例如:http://localhost:8080/blabla,这将导致 404 页面
如果我添加以下 bean,它将覆盖所有现有的控制器,并且无法访问任何 api
@Bean
public RouterFunction<ServerResponse> indexRouter(@Value("classpath:/public/index.html") final Resource indexHtml)
return route(GET("/**"), request -> ok().contentType(MediaType.TEXT_HTML).bodyValue(indexHtml));
是否有针对此问题的已知解决方案? 我可以使用 nginx 将所有无法识别的路径重定向到根路径,但这很难看,我真的不想为了重定向而添加另一层。
谢谢:)
【问题讨论】:
如果你使用路由函数,所有的路由函数都会从上往下读取,这意味着它很像一个开关盒,你可以在底部放置一个“默认”盒,这将将客户端重定向到特定端点。因此“/”(斜杠)将返回您的索引,然后匹配“/**”的 get 函数将返回重定向到硬斜杠。 @ThomasAndolf 我会把它作为答案发布 - 我只是在输入类似的内容:-) 哈哈好吧@MichaelBerry @ThomasAndolf 如果你把它们放在不同的类中会怎样:lankydan.dev/2018/03/21/… 你应该在 bean 中创建依赖关系吗?以确保它最后加载? 那是一种方式,你也可以使用@Order
注解我认为,有几种方式,但我不是真的舒尔!试试看! :)
【参考方案1】:
如果您使用RouterFunctions
,则所有路由器功能都将从顶部和底部读取,这意味着它非常类似于开关盒。
这意味着您可以在底部放置一个“默认”案例,这会将客户端重定向到特定端点。
因此,在您的示例中,/
(斜杠)将返回您的 index.html
,然后匹配 /**
的 GET
函数将返回重定向到硬斜杠 /
。
【讨论】:
我可以将此解决方案扩展为将所有但仅 404页重定向到index.html吗?换句话说,让对现有静态资源的请求为它们服务,只有在没有控制器和静态资源的情况下才重定向到 index.html? 好吧,如果我理解正确的话,理论上你应该首先列出你所有的硬链接,然后最后有一个默认的 catch all case/**
以上是关于Spring Webflux 将所有 404 页面重定向到 index.html的主要内容,如果未能解决你的问题,请参考以下文章
swagger-ui 和 spring webflux 出现 404 错误
Spring Webflux 2.4.2 - 执行器 /auditevents /httptrace /integrationgraph /sessions 端点上的 404