我在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
谢谢!
答案 0 :(得分:0)
你不能。 Tomcat的重写阀不支持任何形式的反向代理。也没有任何其他开箱即用的组件。
答案 1 :(得分:0)
最终我发现了一个满足要求的webapp(反向代理,允许配置)。