Angular Java WAR 中的 RouterModule

Angular RouterModule in Java WAR

我在 Angular 6.0.5 应用程序中使用 Angular 的路由功能。因此,我的应用程序中有如下路径:

运行 我的应用程序使用 ng serve 运行良好。我可以直接在浏览器中输入像 http://localhost:8080/barn 这样的地址,它会加载应用程序并转到应用程序中的适当位置。

构建应用程序后,我将 /dist/ 的全部内容复制到 Java WebApplication 中,编译后生成 WAR。

为了构建它,我使用 ng build --prod --build-optimizer --base-href=/myappdir/

当我在像 Wildfly 这样的应用程序服务器中 运行 WAR 时,我可以成功地进入 URL http://localhost:8080/myappdir/ 并加载应用程序。单击应用程序中的某个路由按钮也成功地将 URL 更改为 http://localhost:8080/barn,但是如果我自己在浏览器中键入 URL http://localhost:8080/barn 然后按回车键,我会得到错误,页面无法加载。

如果我 运行 一个 Angular 应用程序在像 Nginx 这样的网络服务器上使用 Angular 的路由功能,我必须告诉网络服务器指向index.html 文件,即使 URL 请求不同的文件。所以对于 Nginx,这将是 done with configuration 这样的:try_files $uri $uri/ =404;。所以我想问题在 WAR 文件中是一样的。

我必须在 WAR 文件中配置什么才能使其指向 index.html 文件?

好的,我自己发现的。所以,如果有人和我一样尝试,这里是解决这个问题的描述,而不需要在网络服务器中进行调整。

在 Java 项目的 web.xml 中添加一个 404 错误页面。以下四行就可以解决问题:

<web-app ...>

    ...

    <error-page>
        <error-code>404</error-code>
        <location>/index.html</location>
    </error-page>

</web-app>

您可以对路由使用哈希。这样,您就不会破坏它。在你的 app.module.ts:

RouterModule.forRoot( yourAppRoutes, { useHash: true });