【问题标题】:Re-writing tomcat 8 urls重写tomcat 8 url
【发布时间】:2015-10-02 20:59:40
【问题描述】:

我在两个不同的上下文中部署了两个 tomcat 应用程序:

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

我需要截取表单中的url:

someurl.com/clientname/context1/ 

并将它们重定向到 url:

someurl.com/context1/clientname

其中“客户名”是动态的

我尝试在我的 tomcats server.xml 文件的元素中使用重写阀,但它仍然只适用于包含上下文的 url。即:

someurl.com/context1/clientname/context1 

被重写

someurl.com/context1/clientname

使用以下正则表达式:

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

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

有没有办法以不考虑上下文的​​方式全局重写 url?

【问题讨论】:

  • 您的目标是避免在 Java 中在过滤器级别执行此操作吗?我猜你宁愿把它作为一个配置而不是一个类/jar文件对吗?
  • 正确。我实际上找到了解决方案,所以稍后会发布答案。
  • 非常感谢您的提问,您的组正则表达式(使用 $1)帮助我修改了 URL 的最后一部分

标签: regex tomcat url-rewriting rewrite tomcat-valve


【解决方案1】:

经过大量挖掘后,我发现了一种非常简单的方法来实现所需的结果。诀窍是设置一个根上下文而不在那里部署任何实际应用程序。然后在该根上下文中添加一个 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]

这基本上意味着:捕获所有具有以下形式的 ur:clientname/context1/etc 并将它们路由到 context1/clientname/etc

【讨论】:

    猜你喜欢
    • 2015-04-30
    • 2016-04-09
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2014-11-10
    • 2011-10-01
    • 2021-10-11
    相关资源
    最近更新 更多