重写Tomcat 8的URL

3

我有两个Tomcat应用程序,它们部署在不同的上下文中:

someurl.com/context1/
someurl.com/context2/

我需要拦截表单中的网址:

例如:

someurl.com/clientname/context1/ 

并将它们重定向到网址:

someurl.com/context1/clientname

其中“clientname”是动态的

我尝试在tomcat的server.xml文件的<Host>元素中使用重写阀门,但它仅适用于包含上下文的URL。例如:

someurl.com/context1/clientname/context1 

被重写为

someurl.com/context1/clientname

使用以下正则表达式:

RewriteCond %{REQUEST_URI}  ^.*/context1/.*$

RewriteRule ^.*/context1/(.*)$  /context1/$1    [L]

有没有一种方法可以在全局范围内重写URL,使得上下文不被考虑在内?

你的目标是避免在过滤器级别上使用Java吗?我猜你更愿意将其作为配置而不是类/ jar文件,对吗? - Usman Mutawakil
没错。我实际上已经找到了解决方案,稍后会发布答案。 - Radi Radichev
非常感谢您的提问,您的正则表达式组(使用$1)帮助我修改了URL的最后一部分。 - Edenshaw
1个回答

3

经过大量的调查研究,我找到了一种非常简单的方法来实现所需的结果。关键在于设置一个根上下文,而没有任何实际的应用程序部署在那里。然后向该根上下文添加一个RewriteValve,如下所示:

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="ROOT" path="/" reloadable="true" crossContext="true">
    <Valve className="org.apache.catalina.valves.rewrite.RewriteValve"/>
</Context>

设置crossContext为true非常重要,这样根上下文就能与较低级别的上下文进行通信。

然后,在根上下文的WEB-INF中,以下rewrite.config将起到作用:

RewriteRule ^/.*/context1/(.*)$     /context1/$1    [L]

这基本意味着:捕获所有形式为clientname/context1/etc的UR,并将它们路由到context1/clientname/etc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接