Angular/Spring Boot/Azure入口-URL重写
我使用Angular作为前端技术,spring boot作为后端,Azure Ingress作为Web服务器。 我的问题是,当用户刷新站点时,由于角度路由,会出现404错误。 我想知道这种解决这个问题的方法是否是一种良好的实践,我自己的AJAX调用是否会出现任何问题: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
@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项目中,比如在
中。因此,如果您构建Angular应用程序,您将在文件夹src/main/frontend
中获得其静态资源src/main/frontend/dist
- 使用
仅将maven资源插件
中生成的src/main/frontend/dist
复制到输出目录index.html
。因此,最后应该有文件target/classes/templates
target/classes/templates/index.html
- 使用
将任何其他静态资源(如JavaScript、CSS等)从maven资源插件
复制到输出目录src/main/frontend/dist
。这也是您的文件当前所在的位置target/classes/static
- 在Spring Boot应用程序中包括一个便宜的模板引擎,例如,使用
将mustache自动配置为Spring MVC的模板引擎。我们将使用为Angular应用程序生成的Spring Boot starter mustache
作为胡须模板index.html
- 使用返回任何路径的
视图名称的方法创建Spring控制器。请注意此处到索引
的请求映射:/**
@Controller public class IndexPageController { @RequestMapping("/**") public String index() { return "index"; } }
/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
是作为一个小胡子模板处理的,如果需要,它可以包含服务器端模板标记。谢谢你的回答。我喜欢它,因为它比最初提出的解决方案提供更少的复杂性和更多的功能。谢谢您的回答。我喜欢它,因为它比最初提出的解决方案提供更少的复杂性,甚至更多的功能。