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

Chr*_*ngs 2 apache mod-rewrite tomcat reverse-proxy mod-proxy

我试图配置Apache以不同方式对待应用程序的某些端点。

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

Apache正在监听443(SSL)。

查看Apache的文档,我看到一些示例,其中mod_rewrite用于类似的任务,而不是实际的用例。

只有端口80和443(80重定向到443)向外部开放,因此其他端口仅是内部端口……我们将其称为2001、3001和4001。

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

Kar*_*bur 6

首先,您需要确保mod_proxy已启用该功能。然后,假设你想每一个/api//appname//admin/看起来像一个子目录到终端用户,他们正在听的200130014001分别,我想你正在寻找的是这样的:

(在服务器或虚拟主机配置中)

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/
Run Code Online (Sandbox Code Playgroud)

(在.htaccess配置中...没有前导斜线...也没有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]
Run Code Online (Sandbox Code Playgroud)

$1代表什么用括号捕获的。P告诉mod_rewrite使用mod_proxy来处理此重写。L意味着使这成为最后一条规则;应用后停止重写。QSA将来自入站请求的查询字符串追加到重写的请求上。

所述ProxyPassReverse用于从所述内部实例捕捉任何重定向和重写它以匹配外部URI。注:mod_proxy需要在服务器配置(服务器,虚拟主机,目录),是无效.htaccess

一些有用的参考:

现在,尽管如此,您可能还是不想使用mod_rewrite此功能。确实是mod_proxy为您完成了所有工作。如果您没有任何实际的重写,则应直接使用mod_proxy。甚至mod_rewrite只是将其交给mod_proxy任何人。

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

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

RewriteRule ^/?images(.*) http://imageserver.local/images$1 [P]
Run Code Online (Sandbox Code Playgroud)

但是,在许多情况下,如上面的示例所示,当不需要实际的模式匹配时,该ProxyPass指令是更好的选择。这里的示例可以表示为:

ProxyPass /images/ http://imageserver.local/images/ 
Run Code Online (Sandbox Code Playgroud)

请注意,无论您使用RewriteRule还是ProxyPass,都仍然需要使用ProxyPassReverse指令来捕获从后端服务器发出的重定向:

ProxyPassReverse /images/ http://imageserver.local/images/ 
Run Code Online (Sandbox Code Playgroud)

当在同一作用域中还有其他有效的RewriteRules起作用时,您可能需要使用RewriteRule代替,因为RewriteRule通常在ProxyPass之前生效,因此可能抢占您要完成的工作。