我正在尝试在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文件中或将其更改为使用哈希位置策略...
答案 0 :(得分:1)
我最近遇到了类似的挑战,当请求刷新时遇到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"
,这会将路由保留在地址栏中。
我希望这可以帮助您解决当前的挑战。
答案 1 :(得分:0)
为了完整起见,我在这里发布了其他解决方案以实现我的最初目标。 :)
如我在@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中配置)。正则表达式的第二行确保,每次对最可能是文件的内容的调用也都直接通过...由于我有一个多语言应用程序,因此我需要将不同的语言重定向到的index.html文件。正确的文件夹(第3行和第4行)。最后但并非最不重要的一点是,如果单击了Web服务器的根目录,我想重定向到默认语言,在我的情况下为英语(第5行)。
希望有帮助。