我正试图在Wildfly应用程序服务器中使用路径定位策略为Angular 7应用程序提供服务。
我设法使用静态文件处理程序将应用程序添加为静态资源。因此,当请求一个确切的路径时,它会被正确地传递。例如,请求http://my-wildfly-server/myApp/
会发送我的应用程序的index.html
。
由于我使用的是路径定位策略,index.html
文件也应该发送到子链接的客户端。例如,请求http://my-wildfly-server/myApp/my/route
也应该发送我的应用程序的index.html
。
这就引出了我的实际问题:是否可以用某种与nginx的try_file
规则相同的过滤器来配置Wildfly或Undertow子系统?换句话说:提供正确的文件,如果它存在于特定的请求中,例如http://my-wildfly/myApp/styles.css
,或者返回到index.html
并让Angular负责路由?
如果可能的话,我想避免将我的WebApp捆绑到WAR文件中,或者将其更改为使用哈希位置策略。。。
我最近遇到了一个类似的挑战,即404请求刷新。我最初的网络搜索导致需要重写URL。以下解决了我的问题:1-重写规则的过滤器参考
<filter-ref
name="angular-refresh"
predicate="not equals(%R, '/') and not equals(%R, '/index.html') and not path-prefix('/assets/')
and not regex('^/.*.(js|js.map)$') and not regex('^/.*.(css)$')
and not regex('^/.*.(jpe?g|png|gif|svg)$') and not regex('^/.*.(eot|ttf|woff|woff2)$')
and regex('^(.*)$')"
/>
上面的过滤器为我捕获了真实文件的一般资源,然后是Angular管理的路由,过滤器是一行,只是为了清晰起见添加了换行符。
2-重写规则
<rewrite name="angular-refresh" target="/index.html" redirect="false"/>
重写规则中需要注意的一点是redirect="false"
,它将路由保留在地址栏中。
我希望这能帮助你解决当前的挑战。
为了完整起见,我在这里发布了实现我最初目标的另一个解决方案。:)正如我在@Tyrone回答的评论中所描述的,我最终将编译的Angular应用程序捆绑到一个WAR文件中,并将以下文件添加到WEB-INF
文件夹中:
jboss-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd">
<context-root>/</context-root>
</jboss-web>
我希望我的web应用程序托管在web服务器的根目录中。因此context-root
就是/
。。。
undertow-handlers.conf
path-prefix('/api') -> done
regex('^(.*/)(.*.[a-zA-Z0-9]{2,5})$') -> done
path-prefix('/en') -> rewrite('/en')
path-prefix('/de') -> rewrite('/de')
path-prefix('/') -> rewrite('/en')
我的所有/api
调用都应该直接转到相应的路由(在API WAR-File中配置)。regex的第二行确保,对最有可能是文件的东西的每次调用都直接通过。。。由于我有一个多语言应用程序,我需要将不同的语言重定向到正确文件夹的index.html文件(第3行和第4行)。最后但同样重要的是,如果web服务器的根被击中,我想重定向到默认语言,在我的情况下是英语(第5行)。
希望能有所帮助。