使用Apache将端点转发到同一主机上的不同端口

时间:2015-10-12 18:59:00

标签: apache tomcat mod-rewrite reverse-proxy mod-proxy

我正在尝试配置Apache以不同方式处理应用程序的某些端点。

我需要/ api,/ appname和/ admin转发以在同一主机上分离Tomcat实例,显然在不同的端口上运行。

Apache正在侦听443(SSL)。

通过Apache的文档,我看到了mod_rewrite用于类似任务的示例,但不是这个实际用例。

只有端口80和443(80被重定向到443)向外开放,所以其他只是内部...让我们称它们为2001,3001和4001。

编辑:ADDENDUM:我正在使用apache 2.2,目前还没有计划更新到2.4.x.

1 个答案:

答案 0 :(得分:5)

首先,您需要确保mod_proxy已启用。然后,假设您希望/api//appname//admin/中的每一个看起来都像是最终用户的子目录,并且他们正在监听2001,{{1}分别和3001,我认为你要找的是这样的:

(在服务器或vhost配置中)

4001

(在.htaccess配置中......没有前导斜杠......而且没有RewriteRule ^/api/(.*) http://localhost:2001/$1 [P,L,QSA] ProxyPassReverse /api/ http://localhost:2001/ RewriteRule ^/appname/(.*) http://localhost:3001/$1 [P,L,QSA] ProxyPassReverse /appname/ http://localhost:3001/ RewriteRule ^/admin/(.*) http://localhost:4001/$1 [P,L,QSA] ProxyPassReverse /admin/ http://localhost:4001/

mod_proxy

RewriteRule ^api/(.*) http://localhost:2001/otherpath/$1 [P,L,QSA] RewriteRule ^appname/(.*) http://localhost:3001/otherpath/$1 [P,L,QSA] RewriteRule ^admin/(.*) http://localhost:4001/otherpath/$1 [P,L,QSA] 表示由parens捕获的内容。 $1告诉mod_rewrite使用mod_proxy来处理这个重写。 P意味着将此作为最后一条规则;在应用此项后停止重写。 L将来自入站请求的查询字符串附加到重写的请求中。

QSA用于捕获内部实例的任何重定向,并重写它以匹配外部URI。注意:ProxyPassReverse需要在服务器配置(服务器,vhost,目录)中,并且mod_proxy

无效

一些有用的参考:

现在,尽管如此,您可能还是不想使用.htaccess来执行此操作。真的是mod_rewrite正在为你做所有工作。如果您没有进行任何实际重写,则应直接使用mod_proxy。无论如何,mod_proxy只需将其移至mod_rewrite

来自http://httpd.apache.org/docs/2.2/rewrite/avoid.html

  

mod_proxy提供RewriteRule标志以传递重写的URI   [P]

mod_proxy
     

但是,在很多情况下,当没有实际的模式匹配时   如上例所示,RewriteRule ^/?images(.*) http://imageserver.local/images$1 [P] 指令是必需的   更好的选择。此处的示例可以呈现为:

ProxyPass
     

请注意,无论您使用的是ProxyPass /images/ http://imageserver.local/images/ 还是RewriteRule,您还是会   需要使用ProxyPass指令来捕获重定向   从后端服务器发出:

ProxyPassReverse
     

当有其他内容时,您可能需要使用RewriteRule   RewriteRules在相同的范围内有效,就像RewriteRule一样   通常在ProxyPass之前生效,因此可以抢占什么   你正试图完成。