背景
我在一个简单的Java应用程序中使用Spring Boot 1.4。作为一个实验,我决定编写自己的servletContainer()bean,将Tomcat的RewriteValve注入容器中。该阀门作为全局上下文阀门添加,应该适用于所有请求。
我正在使用Tomcat 8.5.x。
因为阀门要求配置在WEB-INF文件夹中可用,所以我设法覆盖它的startInternal()方法,让它读取一个类路径位置下的rewrite.config文件,即container / tomcat / rewrite的.config。
阀门读取配置正常。 rewrite.config文件只是声明了以下规则:
^/app2.+ /app
意思是,当请求网址以/ app2开头时,将网址重写为/ app。
重要的是要注意应用程序本身部署在/ app下,而不是ROOT下。这是通过server.context-path属性处理的。
什么行不通
由于应用程序部署在/ app下,因此在提交/ app2请求时永远不会真正调用阀门。例如:
如果我删除root下的context-path和deploy / app,我就可以观察到:
什么有用
使用外部tomcat容器,如果我使用相同的规则手动配置阀门,并在/ app下部署应用程序,我可以观察:
我可能做错了什么?
答案 0 :(得分:0)
您在用于描述重写规则的正则表达式中犯了错误
^/app2.+ /app
" 。+ " part表示出现一次或多次的任何字符,但app2字符串后面至少需要有一个字符。我认为您应该将其更改为" 。* "这意味着app2之后可能会有一个角色,但与此同时我们并不期望它会在那里:
^/app2.* /app