Angular / Spring Boot / Azure Ingress - URL 重写

马特乌斯·克利门托维奇

我使用 Angular 作为前端技术,使用 Spring Boot 作为后端,使用 Azure Ingress 作为网络服务器。我的问题是,当用户刷新站点时,由于 Angular 路由会出现 404 错误。我想知道这种解决这个问题的方法是否是一个很好的做法,如果我自己的 AJAX 调用可能会引起任何问题:

@Configuration
class WebApplicationConfig
{
    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer()
    {
        return container -> {
            container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/index.html"));
        };
    }
}

?

编辑

我正在寻找的是针对我的技术堆栈的某种 URL 重写(例如在 Apache 网络服务器上)。目前,JAR 文件中有一个静态文件夹,用于返回我的 Angular 文件。如果始终请求链接,则返回角度文件(index.html 和依赖项),但当用户工作时,URL 更改(仅在前端),如果他随后点击站点刷新,则会出现 404 错误。

例如

http://somehost/some/static/url/ <-- 好的

http://somehost/some/static/url/and/angular/route <-- 404

所以我想知道上面的解决方案是否是一个好的解决方案。或者也许有另一个更好的解决方案?

乔治·维特伯格

听起来您的 Angular 应用程序直接由您的 Spring Boot 应用程序提供服务。如果您想坚持使用此解决方案(避免使用单独的 Web 服务器),则必须确保 Spring Bootindex.html在任何路径下(当然,用于 API 的路径除外)为您的 Angular 应用程序提供服务,如 Mixalloff 所述。

这是我在一个项目中的做法:

  • 将 Angular 项目作为 Maven 项目中的一个子项目,假设在src/main/frontend. 因此,如果您构建 Angular 应用程序,您将在文件夹中获得其静态资源src/main/frontend/dist
  • 使用maven-resources-plugin仅将index.html生成的文件复制src/main/frontend/dist到输出目录中target/classes/templates所以最后应该有文件target/classes/templates/index.html
  • 使用maven-resources-plugin将任何其他静态资源(如 JavaScript、CSS 等)复制src/main/frontend/dist到输出目录target/classes/static这也是您的文件当前所在的位置。
  • 在您的 Spring Boot 应用程序中包含一个廉价的模板引擎,例如使用 将spring-boot-starter-mustacheMustache 自动配置为 Spring MVC 的模板引擎。我们将使用index.html为您的 Angular 应用程序生成的作为 Mustache 模板。
  • 创建一个带有返回index任何路径视图名称的方法的 Spring 控制器请注意映射到/**此处的请求

    @Controller
    public class IndexPageController {
      @RequestMapping("/**")
      public String index() {
        return "index";
      }
    }
    

返回索引页的通配符方法由 Spring MVC 自动排在最后,参见https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-requestmapping-pattern-比较

因此,您仍然可以添加更多映射到更具体路径的控制器,例如/api/v1/whatever.

最后,您的 Spring Boot 应用程序将始终返回index.html与更具体的请求映射不匹配的任何路由文件。

这带来了更多的糖:由于index.html被处理为 Mustache 模板,如果需要,它可以包含服务器端模板标记。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CSS中的URL被Angular重写

来自分类Dev

在Azure Web应用中重写URL

来自分类Dev

Azure CDN Url重写对缓存不友好

来自分类Dev

Spring Boot和Angular 2的URL处理问题

来自分类Dev

Spring MVC URL由Nginx重写

来自分类Dev

Angular URL 重写没有发生

来自分类Dev

Spring Boot Eureka-CSS不在Kubernetes / Ingress上显示

来自分类Dev

Azure URL 重写任何没有扩展名的 URL

来自分类Dev

Kubernetes Ingress 配置重写问题

来自分类Dev

重写后重写url

来自分类Dev

在每个spring boot @Test上重写单个@Configuration类

来自分类Dev

Spring Boot +云| Zuul代理| 附加网址/重写

来自分类Dev

如何使用PHP在Azure网站上使用URL重写

来自分类Dev

如何使用PHP在Azure网站上使用URL重写

来自分类Dev

如何通过REST控制器用Spring(引导)重写URL?

来自分类Dev

Spring Boot Rest 服务 Angular

来自分类Dev

Angular Basic Auth Spring Boot

来自分类Dev

Nginx重写不重写url

来自分类Dev

Azure DocumentDB和Spring Boot冲突

来自分类Dev

静态HTML的Spring Boot URL映射

来自分类Dev

如何为Spring Boot Webapp选择URL?

来自分类Dev

Spring Boot:为RestControllers配置url前缀

来自分类Dev

Spring Boot Jersey和监视URL

来自分类Dev

网址重写Azure PHP?

来自分类Dev

Spring Boot应用程序java -jar --property重写无法正常工作

来自分类Dev

htaccess从URL查询重写

来自分类Dev

重写URL,但列表?

来自分类Dev

URL重写.htaccess

来自分类Dev

在中心重写URL