【问题标题】:Spring Webflux redirect all 404 pages to index.htmlSpring Webflux 将所有 404 页面重定向到 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注解我认为,有几种方式,但我不是真的舒尔!试试看! :)

标签: java spring-boot netty spring-webflux


【解决方案1】:

如果您使用RouterFunctions,则所有路由器功能都将从顶部和底部读取,这意味着它非常类似于开关盒。

这意味着您可以在底部放置一个“默认”案例,这会将客户端重定向到特定端点。

因此,在您的示例中,/(斜杠)将返回您的 index.html,然后匹配 /**GET 函数将返回重定向到硬斜杠 /

【讨论】:

  • 我可以将此解决方案扩展为将所有 404页重定向到index.html吗?换句话说,让对现有静态资源的请求为它们服务,只有在没有控制器和静态资源的情况下才重定向到 index.html?
  • 好吧,如果我理解正确的话,理论上你应该首先列出你所有的硬链接,然后最后有一个默认的 catch all case /**
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 2015-07-11
  • 2018-01-25
  • 2020-05-16
  • 2012-09-12
  • 1970-01-01
  • 2019-02-02
  • 2013-02-15
相关资源
最近更新 更多