使用RewriteRule的Tomcat webapp反向代理

时间:2017-10-07 15:03:52

标签: java tomcat mod-rewrite reverse-proxy

我在tomcat中有一个简单的webapp,我想将特定端点路由到外部url(使用端点之后的路径),例如:

localhost/myapp/api/hello -> http://my-api-domain.com/hello

我添加到应用程序的META-INF文件夹内的context.xml中 然后使用以下语法将rewrite.config文件添加到WEB-INF文件夹:

RewriteRule ^/api/.*$ http://my-api-domain.com/$1 [L]
RewriteRule ^/.*$ hello.html [L]

它正确地将所有端点路由到hello.html,但是当我导航到/ api /它时会返回以下错误:

java.lang.IndexOutOfBoundsException: No group 1
    java.util.regex.Matcher.group(Matcher.java:538)
    org.apache.catalina.valves.rewrite.Substitution$RewriteRuleBackReferenceElement.evaluate(Substitution.java:43)
    org.apache.catalina.valves.rewrite.Substitution.evaluate(Substitution.java:267)
    org.apache.catalina.valves.rewrite.RewriteRule.evaluate(RewriteRule.java:135)
    org.apache.catalina.valves.rewrite.RewriteValve.invoke(RewriteValve.java:351)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1441)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)

在重写配置中没有'$ 1',a.g

RewriteRule ^/api/.*$ http://my-api-domain.com/ [L]

它返回404:

/myapphttp://my-api-domain.com/

如何退出应用上下文并将请求转发到外部网址?我如何让它透明? (所以似乎api请求也来自myapp)

我尝试在Rewrite中添加P标志而不是L,但它失败并带有以下内容:

Invalid flag in: RewriteRule ^/api/.*$ http://my-api-domain.com/ [P] flag: P

Tomcat版本:8.5.12 ,Java版本:1.8.0_144

谢谢!

2 个答案:

答案 0 :(得分:0)

你不能。 Tomcat的重写阀不支持任何形式的反向代理。也没有任何其他开箱即用的组件。

答案 1 :(得分:0)

最终我发现了一个满足要求的webapp(反向代理,允许配置)。

j2ep