我使用 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 所述。
这是我在一个项目中的做法:
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-starter-mustache
Mustache 自动配置为 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] 删除。
我来说两句