Tomcat 使用 RewriteRule 的 webapp 反向代理
Tomcat webapp reverse proxy using RewriteRule
我在 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/ [L]
RewriteRule ^/.*$ hello.html [L]
它正确地将所有端点路由到 hello.html,但是当我导航到 /api/ 它时 return 出现以下错误:
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]
它 returns 404:
/myapphttp://my-api-domain.com/
如何退出应用上下文并将请求转发到外部 url?以及如何使其透明? (所以看起来 api 请求也来自 myapp)
我尝试在重写中添加 P 标志而不是 L,但失败并显示以下内容:
Invalid flag in: RewriteRule ^/api/.*$ http://my-api-domain.com/ [P] flag: P
Tomcat版本:8.5.12
, Java 版本: 1.8.0_144
谢谢!
你不能。 Tomcat 的重写阀不支持任何形式的反向代理。其他开箱即用的组件也没有。
最终我找到了满足要求的webapp(反向代理,允许配置)。
我在 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/ [L]
RewriteRule ^/.*$ hello.html [L]
它正确地将所有端点路由到 hello.html,但是当我导航到 /api/ 它时 return 出现以下错误:
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]
它 returns 404:
/myapphttp://my-api-domain.com/
如何退出应用上下文并将请求转发到外部 url?以及如何使其透明? (所以看起来 api 请求也来自 myapp)
我尝试在重写中添加 P 标志而不是 L,但失败并显示以下内容:
Invalid flag in: RewriteRule ^/api/.*$ http://my-api-domain.com/ [P] flag: P
Tomcat版本:8.5.12 , Java 版本: 1.8.0_144
谢谢!
你不能。 Tomcat 的重写阀不支持任何形式的反向代理。其他开箱即用的组件也没有。
最终我找到了满足要求的webapp(反向代理,允许配置)。