URL Redirection/Rewrite 在 Tomcat

URL Redirection/Rewrite on Tomcat

我们正在将托管在 JBOSS 上的 clickonce 应用程序(这不是通常的 war/ear 部署)迁移到 Tomcat,但是 URL 重定向存在问题.

用户从浏览器点击的实际URL如下所示,

https://abc.domainname:port/app/app.application

这应该如下重定向,

https://abc.domainname:port/abc/app/app.application

应用部署在tomcatbasedir/webapp/abc/app

我曾尝试使用 重写阀,但这并没有帮助我实现这一目标。

context.xml 或 server.xml

阀门类名="org.apache.catalina.valves.rewrite.RewriteValve" 和

在 catalinahome/conf 下创建了一个 rewrite.config 并放置了以下条目。

RewriteRule  ^/app/app.application$  abc/app/app.application [RL]

有关信息,请参阅 JBOSS 中用于执行重定向的规则。

rewrite name="rule-1" pattern="^/app/app.application" substitution="/abc/app/app.application" flags= “RL”

错误跟踪:

        SEVERE: A child container failed during start
    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [org
    .apache.catalina.valves.rewrite.RewriteValve[localhost]]
            at java.util.concurrent.FutureTask.report(FutureTask.java:122)
            at java.util.concurrent.FutureTask.get(FutureTask.java:188)
            at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:931)
            at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:261)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
            at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
            at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:766)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
            at org.apache.catalina.startup.Catalina.start(Catalina.java:688)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:606)
            at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342)
            at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)
    Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.valves.rewrite.RewriteValve[localhost]]
            at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
            at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:176)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
            at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:948)
            at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
            at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1412)
            at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1402)
            at java.util.concurrent.FutureTask.run(FutureTask.java:262)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
            at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.IllegalArgumentException: rewriteValve.invalidLine
            at org.apache.catalina.valves.rewrite.RewriteValve.parse(RewriteValve.java:709)
            at org.apache.catalina.valves.rewrite.RewriteValve.parse(RewriteValve.java:237)
    :

rewrite.config

上的内容

RewriteEngine 开启

RewriteRule "^/app/app.application" "/abc/app/app.application" [RL]

非常感谢任何指点或帮助。

RewriteValve 中没有 RewriteEngine 指令(参见 documentation),因此出现解析错误。

RewriteRule 指令几乎与 Apache 的 mod_rewrite 指令一样工作,但有一点不同:模式必须匹配 整个 URI 路径。因此你需要使用:

RewriteRule /app/app.application(/.*)? /abc/app/app.application [RL]