Apache:基于URL后缀的代理

我的团队编写了一个内部BI服务器,该服务器通过链接(如/users/daily/updates/questions生成HTML报告。

服务器是用Grails编写的,它可以和Apache-Tomcat的经典设置完美的结合起来:

 ProxyPass / http://localhost:8080/ nocanon ProxyPassReverse / http://localhost:8080/ 

在这里输入图像说明

所以

 https://example.com/users/daily 

被内部代理

 http://localhost:8080/users/daily 

并从Tomcat servlet服务。

服务器是成功的,我想部署它三次到3个不同的系统,通过URL后缀( /dev/stg/prod )来区分:

在这里输入图像说明

这意味着https://example.com/dev/users/daily将从http://localhost:8080/users/daily代理,并且https://example.com/prod/users/daily将从http://localhost:8082/users/daily

我已经尝试了一些Apache RewriteRuleProxyPass规则,但是找不到工作组合。

如何在Apache中使用基于后缀的内部路由来实现内部链接?

你可以这样做

 <Location /dev> RewriteEngine on RewriteRule ^/dev/(.*) /$1 ProxyPass / http://localhost:8080/ nocanon ProxyPassReverse / http://localhost:8080/ </Location> 

等等。 这将为您提供不同URL的代理,并从URL中删除前导/ dev,/ staging或/ prod。

但有一个问题:从Tomcat返回的HTML中的链接将具有/,而不是/ dev等的URL基础。要将该前缀重新添加到HTML中,您必须使用mod_proxy_html或等效的parsingHTML,修改它,并把它放在一起。 这可以工作,但有一个性能成本; 格式不正确的HTML可能会变形; 你将不得不重写在CSS和JavaScript的url; 和Javascript可能是不可能得到正确的。

另一个可能更简单的选项是:在DNS中创build新的主机名:dev.biserver.example.com,staging.biserver.example.com和prod.biserver.example.com。 然后,URL重写将消失,您可以使用虚拟主机完成所有操作,例如:

 <VirtualHost *:443> ServerName dev.biserver.example.com ProxyPass / http://localhost:8080/ nocanon ProxyPassReverse / http://localhost:8080/ </VirtualHost> 

等等。