Angular HTML5 URL - 服务器配置

时间:2015-06-16 05:07:49

标签: angularjs spring spring-boot

我已经读过AngularJS使用hashbang URL作为默认值 - 但这不是优势,因此应该使用HTML5 URL。 要在客户端配置此行为,必须执行以下操作:

...
$locationProvider.html5Mode(true);
...

在服务器端,还必须完成一些配置 - 因为我知道应该配置URL请求,因此应该将包含ng-app的页面(起始页面 - 例如index.html)传递给客户端。不包括提供静态资源(CSS,图像,AngularJS部分,...)和用于CRUD的URL(例如,有效服务URL)的URL。

我的问题不在于如何在服务器端调整此行为(例如,对于内置嵌入式服务器的String Boot)?

另一个问题是,如果你在AngularJS应用程序中区分静态资源(例如...... / static / ..)和CRUD URL(例如... / database / ...)?

非常感谢!

2 个答案:

答案 0 :(得分:4)

在Spring Boot中,你可以像这样配置一个全能视图控制器:

@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)用于确保此catch-all转发仅在找不到其他路由后才适用。

但是,现在所有资源查找也都通过此视图控制器进行路由(因为在应用默认资源处理程序之前,WebMvcAutoConfiguration会检查路径模式是否存在)。

一种可能的解决方法是在application.properties中设置静态路径模式以包含对文件扩展名的检查:

spring.mvc.static-path-pattern = /**.*

这仅适用于角度路线不包含任何扩展名的情况。 另一种方法是完全禁用spring boot的资源处理(spring.resources.addMappings = false)并替换你自己的资源。

答案 1 :(得分:0)

基本上,您希望为请求接受值为/index.html的所有404提供text/html(您的Angular应用)。 Angular将在路线上获得并将按预期运行。如果可以的话,尝试在Web服务器级别处理这个问题,它会比在您使用的任何框架中处理它更有效。

至于其他问题,某些网站使用类似api.example.com的子网域,而某些网站使用类似example.com/api的路径。主要是非问题,但如果您使用子域,则可能需要配置CORS