我的团队编写了一个内部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 RewriteRule和ProxyPass规则,但是找不到工作组合。
如何在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>
等等。