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

使用 Spring Webflux 返回元素列表

Web上的Webflux嵌套路由器始终返回404

如何使用 WebFlux 在 Spring Boot 2 中设置登录页面?

如何使用WebFlux在Spring Boot 2中设置登录页面?