JBoss部署Angular 5+应用访问<context>/<ROUTER_URL>时出现404错误
我猜你生产环境大概率遇到的是访问带上下文路径的URL(比如http://your-jboss-domain/your-app-context/home)时出现404,或者路由跳转异常的问题吧?毕竟本地开发用的是根路径/,但部署到JBoss后WAR包会有自己的上下文路径,Angular默认的路由和资源路径配置没适配这个,所以会出问题。下面是一步步的解决办法:
1. 配置Angular的基础路径(base href)
Angular需要知道自己部署的基础上下文路径,这样所有资源和路由都会基于这个路径加载。
在
angular.json里找到build配置下的options,添加baseHref参数:"build": { "options": { "baseHref": "/your-app-context/", // 其他配置... } }这里的
your-app-context就是你WAR包部署后JBoss分配的上下文路径(如果WAR包名是my-app.war,默认上下文路径就是/my-app)。或者打包时通过命令行动态指定,这样不用硬编码:
ng build --base-href /your-app-context/对应到
frontend-maven-plugin的配置里,把npm run build改成带参数的命令:<plugin> <groupId>com.github.eirslett</groupId> <artifactId>frontend-maven-plugin</artifactId> <version>1.12.1</version> <executions> <execution> <id>npm run build</id> <goals> <goal>npm</goal> </goals> <configuration> <arguments>run build -- --base-href /your-app-context/</arguments> </configuration> </execution> </executions> <!-- 其他配置(node、npm版本等) --> </plugin>
2. 配置JBoss的重写规则解决路由刷新404问题
因为Angular是单页应用,所有路由都是前端路由,当用户直接刷新/your-app-context/home或者从外部链接进入时,JBoss会尝试找对应的后端资源,自然会返回404。解决这个需要让JBoss把所有前端路由请求转发到index.html。
在你的WAR包的
WEB-INF目录下创建jboss-web.xml,添加上下文路径和欢迎页配置:<jboss-web> <context-root>/your-app-context</context-root> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </jboss-web>再创建
WEB-INF/web.xml,添加错误页面重定向:<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0"> <error-page> <error-code>404</error-code> <location>/index.html</location> </error-page> </web-app>这样JBoss遇到404时会转发到Angular的入口文件,由前端路由处理。
3. 验证Angular路由配置
确保你的路由模块里没有硬编码的绝对路径,所有路由都是相对路径:
const routes: Routes = [ { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: 'home', component: HomeComponent }, // 其他路由... ];
这样路由会自动基于baseHref拼接,不会出现路径错误。
4. 测试打包后的WAR
打包完成后,把WAR包部署到JBoss,访问http://your-jboss-domain/your-app-context/home,应该就能正常加载页面,刷新或者跳转路由也不会再出现404了。
如果还有其他具体问题(比如资源加载失败、上下文路径不生效),可以再补充细节哦!
内容的提问来源于stack exchange,提问作者Kris

