我在react
服务器上运行了dropwizard
个应用。 {/ 1}}在/ ui上提供。当我打开/ ui上的url并导航应用程序(和goto / ui / content)时,它运行正常。但是当我尝试刷新/ app / content这样的特定页面时,它会提供bundle.js
。
我知道客户端渲染和服务器端渲染以及我需要对/ ui进行404
调用并在客户端路由其余部分,但我找不到任何关于如何做的文档它在GET
。
我也知道使用dropwizard
代替hashHistory
会起作用(因为url的哈希部分没有发送到服务器),但我想知道是否可以使用browserHistory完成此操作。
有关于如何配置browserHistory
服务器的文档,但我找不到express
的任何内容。
答案 0 :(得分:2)
在Dropwizard级别,您可以使用servlet过滤器重写URL。一个流行的实现是Tucky UrlRewriteFilter。您可以按如下方式实现它:
使用Dropwizard注册过滤器:
@Override
public void run(ExampleConfiguration configuration, Environment environment) {
FilterRegistration.Dynamic registration = environment.servlets()
.addFilter("UrlRewriteFilter", new UrlRewriteFilter());
registration.addMappingForUrlPatterns(null, true, "/*");
registration.setInitParameter("confPath", "urlrewrite.xml");
}
将urlrewrite.xml
配置文件添加到src/main/resources
,添加重写规则
<urlrewrite>
<rule>
<from>^/(?!(api|static/|manifest\.json|assets-manifest\.json|favicon\.ico)).*$</from>
<to type="forward">/index.html</to>
</rule>
</urlrewrite>
上述规则规定,如果请求路径与上述正则表达式匹配,则将请求转发给index.html
文件。我以前测试的是create-react-app,其中输出是匹配器中列出的一些文件。这些文件不应该转发。
正则表达式使用负前瞻,所以它就像一个否定。可能看起来我说如果路径匹配那些文件,那么前进,但实际上是相反的。如果您没有使用create-react-app,那么您的正则表达式将会有所不同。重点是否定你不想转发的文件。
我整理了一个工作演示。查看GitHub repo。