Angular RouterModule 在 Java WAR 中
Angular RouterModule 在 Java WAR 中
我在我的Angular 6.0.5应用程序中使用了Angular的路由功能。因此,我的应用程序中有以下路径:
http://localhost:8080/area
http://localhost:8080/barn
http://localhost:8080/tower
使用ng serve
命令运行我的应用程序效果很好。我可以直接在浏览器中输入地址http://localhost:8080/barn
,它将加载应用程序并跳转到适当的位置。
构建完应用程序后,我将/dist/
目录下的所有内容复制到一个Java Web应用程序中,然后编译生成WAR文件。
构建应用程序时,我使用命令ng build --prod --build-optimizer --base-href=/myappdir/
在像Wildfly这样的应用服务器上运行WAR文件时,我可以成功访问URLhttp://localhost:8080/myappdir/
并加载应用程序。在应用程序中点击某个路由按钮也可以成功更改URL,例如http://localhost:8080/barn
,但是如果我自己在浏览器中输入URLhttp://localhost:8080/barn
然后按下回车键,我会收到一个无法加载页面的错误。
如果我在像Nginx这样的Web服务器上运行使用Angular的路由功能的Angular应用程序,我必须告诉Web服务器指向index.html
文件,即使URL请求的是不同的文件。所以在Nginx中,这可以通过类似于这样的配置来实现:try_files $uri $uri/ =404;
。所以我想WAR文件中的问题应该是一样的。
那么我在WAR文件中需要进行什么配置才能使其指向index.html
文件呢?
Angular RouterModule在Java WAR中的问题出现的原因是在使用Angular RouterModule时,如果直接在浏览器中访问某个子路由,而不是通过主路由导航到该子路由,会导致404错误。
解决这个问题的方法是在Java项目的web.xml
文件中添加一个404错误页面。只需要添加以下四行代码即可解决问题:
<web-app ...> ... <error-page> <error-code>404</error-code> <location>/index.html</location> </error-page> </web-app>
这样做的作用是将所有404错误的请求重定向到index.html
页面,这样Angular应用就可以处理这些错误并正确显示对应的子路由页面。