Angular/Spring Boot/Azure入口-URL重写

Angular/Spring Boot/Azure入口-URL重写,angular,azure,url,spring-boot,Angular,Azure,Url,Spring Boot,我使用Angular作为前端技术,spring boot作为后端,Azure Ingress作为Web服务器。 我的问题是,当用户刷新站点时,由于角度路由,会出现404错误。 我想知道这种解决这个问题的方法是否是一种良好的实践,我自己的AJAX调用是否会出现任何问题: @Configuration class WebApplicationConfig { @Bean public EmbeddedServletContainerCustomizer containerCustom

我使用Angular作为前端技术,spring boot作为后端,Azure Ingress作为Web服务器。 我的问题是,当用户刷新站点时,由于角度路由,会出现404错误。 我想知道这种解决这个问题的方法是否是一种良好的实践,我自己的AJAX调用是否会出现任何问题:

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

编辑 我正在搜索的是对我的技术堆栈进行某种URL重写(例如在Apache Web服务器上)。 当前,JAR文件中有一个静态文件夹正在返回我的角度文件。如果请求链接 始终返回角度文件(index.html和依赖项),但在用户工作时,URL会发生更改(仅在前端),如果用户 点击站点刷新出现404错误

e、 g


角度传感器独立确定路线,必须管理404页面和其他页面的显示。您需要始终为服务器中的所有请求提供index.html文件

服务器独立确定路由,并且必须管理404页和其他页的显示。您需要始终为服务器中的所有请求提供index.html文件

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

以下是我在一个项目中是如何做到这一点的:

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

    @Controller
    public class IndexPageController {
      @RequestMapping("/**")
      public String index() {
        return "index";
      }
    }
    
返回索引页的通配符方法最后由Spring MVC自动排序,请参阅

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

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


这还带来了更多的好处:因为
index.html
是作为一个小胡子模板处理的,如果需要,它可以包含服务器端模板标记。

听起来像是你的Angular应用程序直接由你的Spring Boot应用程序提供服务。如果你想坚持使用这个解决方案(避免使用单独的web服务器),你必须确保Spring Boot在任何路径下(当然,除了那些用于API的路径)为Angular应用程序提供
index.html
,如Mixalloff所述

以下是我在一个项目中是如何做到这一点的:

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

    @Controller
    public class IndexPageController {
      @RequestMapping("/**")
      public String index() {
        return "index";
      }
    }
    
返回索引页的通配符方法最后由Spring MVC自动排序,请参阅

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

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


这就带来了更多的好处:因为
index.html
是作为一个小胡子模板处理的,如果需要,它可以包含服务器端模板标记。

谢谢你的回答。我喜欢它,因为它比最初提出的解决方案提供更少的复杂性和更多的功能。谢谢您的回答。我喜欢它,因为它比最初提出的解决方案提供更少的复杂性,甚至更多的功能。