我读到AngularJS默认使用hashbang URL - 但这不是一个优势,因此应该使用HTML5 URL。为了在客户端配置此行为,必须执行以下操作:
...
$locationProvider.html5Mode(true);
...
在服务器端也必须进行一些配置 - 正如我所理解的那样,应该配置 URL 请求,因此内部带有 ng-app 的页面(起始页面 - 例如 index.html)应该交付给客户端。不包括提供静态资源的URL(CSS,images,AngularJS部分等)和用于CRUD的URL(例如RESTful服务URL)。
我的问题不是如何在服务器端调整这种行为(例如,对于内部有嵌入式服务器的字符串启动)?
另一个问题是,您是否在我们的 AngularJS 应用程序中区分静态资源(例如 .../static/..) 和 CRUD URL(例如 .../database/...)?
多谢!
在 Spring Boot 中,您可以像这样配置一个 catch-all 视图控制器:
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.setOrder(Ordered.LOWEST_PRECEDENCE);
registry.addViewController("/**").setViewName("forward:/index.html");
}
}
这会将所有未以其他方式处理的请求转发到 index.html。 setOrder(Ordered.LOWEST_PRECEDENCE)
用于确保此捕获全部转发仅在未找到其他路由后适用。
但是,现在所有资源查找也都通过此视图控制器路由(因为 WebMvcAutoConfiguration 在应用默认资源处理程序之前会检查路径模式是否存在)。
一种可能的解决方法是在application.properties
中设置静态路径模式以包括对文件扩展名的检查:
spring.mvc.static-path-pattern = /**.*
仅当角度路线不包含任何扩展时,此操作才有效。另一种方法是完全禁用 spring boot 的资源处理(spring.resources.addMappings = false
)并替换您自己的资源处理。
您希望为所有404
提供/index.html
(您的 Angular 应用程序),请求接受值为 text/html
。Angular 将在路线上拾取并按预期运行。如果可以的话,尝试在 Web 服务器级别处理这个问题,这将比在你使用的任何框架内处理它更有效。
至于另一个问题,有些网站使用像api.example.com
这样的子域,有些网站使用像example.com/api
这样的路径。这主要不是问题,但如果使用子域,则可能需要配置 CORS。